/ Hex Artifact Content
Login

Artifact 64f42bd0d20f180f99727ce5a3755a97c9a12700:


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 21 69 73 4f 70     assert( !isOp
9cf0: 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a 20 20 20  en(p->fd) );.   
9d00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9d10: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9d20: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9d30: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9d40: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9d50: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9d60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9d70: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
9d80: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
9d90: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
9da0: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
9db0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9dc0: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9dd0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9de0: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9df0: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9e00: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9e10: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9e20: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9e30: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9e40: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9e50: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
9e60: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
9e70: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
9e80: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
9e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
9ea0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
9eb0: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9ec0: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9ed0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9ee0: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9ef0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9f00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9f10: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9f20: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9f30: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9f40: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9f50: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
9f60: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
9f70: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
9f80: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f90: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
9fa0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9fb0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9fc0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9fd0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9fe0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a000: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
a010: 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  CK );.      brea
a020: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a030: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
a040: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a050: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a060: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a070: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a080: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a090: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
a0a0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a0b0: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a0c0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a0d0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a0e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a0f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a100: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
a110: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
a120: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a130: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a140: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a150: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a160: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a170: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a180: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a1a0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a1b0: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a1c0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a1d0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a1e0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a1f0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a200: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a210: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a220: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a230: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a240: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a250: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a260: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a270: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a280: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a290: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a2a0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a2b0: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a2c0: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a2d0: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a2e0: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a2f0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a300: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a310: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a320: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a330: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a340: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a350: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a360: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a370: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a380: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a390: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a3a0: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a3b0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a3c0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a3d0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a3e0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a3f0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a400: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a410: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a420: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a430: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a440: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a450: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a470: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a480: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a490: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a4a0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a4b0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
a4c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a4d0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a4e0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a4f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a500: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a510: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a520: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a530: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a540: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a550: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a560: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a570: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a580: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a590: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a5a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a5b0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a5c0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a5d0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a5e0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a5f0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a600: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a610: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a620: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a640: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a650: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a660: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a670: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a680: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a690: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a6a0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a6b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a6c0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a6d0: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a6e0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a6f0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a700: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a710: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a720: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a730: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a740: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a750: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a760: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a770: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a780: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a790: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a7a0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a7b0: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a7c0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a7d0: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a7e0: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a7f0: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a800: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a810: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a820: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a830: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a840: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a850: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a860: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a870: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a880: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a890: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a8a0: 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 50  pPCache)>0 || pP
a8b0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
a8c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a8d0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a8e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a8f0: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a900: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a910: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a920: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a930: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a940: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a950: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a960: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a970: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a980: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a990: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a9a0: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a9b0: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a9c0: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a9d0: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a9e0: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a9f0: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
aa00: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
aa10: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
aa20: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
aa30: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
aa40: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
aa50: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
aa60: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
aa70: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
aa80: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
aa90: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
aaa0: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
aab0: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
aac0: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
aad0: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
aae0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
aaf0: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
ab00: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
ab10: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
ab20: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ab30: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
ab40: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
ab50: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
ab60: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
ab70: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
ab80: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
ab90: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
aba0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
abb0: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
abc0: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
abd0: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
abe0: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
abf0: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
ac00: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
ac10: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
ac20: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
ac30: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
ac40: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
ac50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ac60: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
ac70: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
ac80: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
ac90: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
aca0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
acb0: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
acc0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acd0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ace0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
acf0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
ad00: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ad10: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
ad20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
ad30: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
ad40: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ad50: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
ad60: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
ad70: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
ad80: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ad90: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
ada0: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
adb0: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
adc0: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
add0: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ade0: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
adf0: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ae00: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ae10: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ae20: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
ae30: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ae40: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
ae50: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
ae60: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
ae70: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
ae80: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
ae90: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
aea0: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
aeb0: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
aec0: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
aed0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
aee0: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
aef0: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
af00: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
af10: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
af20: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
af30: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
af40: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
af50: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
af60: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
af70: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
af80: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
af90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
afa0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
afb0: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
afc0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
afd0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
afe0: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
aff0: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
b000: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
b010: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
b020: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
b030: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
b040: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b050: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b060: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
b070: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
b080: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b090: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
b0a0: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
b0b0: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
b0c0: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
b0d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
b0e0: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
b0f0: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
b100: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
b110: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
b120: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
b130: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
b140: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b150: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
b160: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
b170: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
b180: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b190: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
b1a0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
b1b0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
b1c0: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
b1d0: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
b1e0: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
b1f0: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
b200: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
b210: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b220: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
b230: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
b240: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
b250: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
b260: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b270: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
b280: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
b290: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
b2a0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b2b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b2c0: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b2d0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b2e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b2f0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b300: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
b310: 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  p;.  Pgno pgno =
b320: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e   pPg->pgno;.  in
b330: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b340: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b350: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
b360: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
b370: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
b380: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
b390: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
b3a0: 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
b3b0: 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  l(p->pInSavepoin
b3c0: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b3d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b3e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b3f0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
b400: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
b410: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b420: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b430: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b440: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b450: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b460: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b470: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b480: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b490: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b4a0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b4b0: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64  g->pgno);.}.#end
b4c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
b4d0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b4e0: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
b4f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b500: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
b510: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
b520: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
b530: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
b540: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
b550: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
b560: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b570: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b580: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
b590: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
b5a0: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
b5b0: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
b5c0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
b5d0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b5e0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b5f0: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
b600: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
b610: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
b620: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
b630: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
b640: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
b650: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b660: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
b670: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
b680: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b690: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b6a0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b6b0: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
b6c0: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
b6d0: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
b6e0: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
b6f0: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
b700: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
b710: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
b720: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b730: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
b740: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
b750: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
b760: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
b770: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
b780: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b790: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
b7a0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
b7b0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b7c0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b7d0: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
b7e0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
b7f0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
b800: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b810: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
b820: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
b830: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b840: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b850: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
b860: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
b870: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f  her NO_LOCK.** o
b880: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52  r SHARED_LOCK. R
b890: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
b8a0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
b8b0: 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28  call to xUnlock(
b8c0: 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73  ).** succeeds, s
b8d0: 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f  et the Pager.eLo
b8e0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  ck variable to m
b8f0: 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70  atch the (attemp
b900: 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a  ted) new lock..*
b910: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b920: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b930: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b940: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b950: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
b960: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
b970: 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f  y it. See the co
b980: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
b990: 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55  #define of .** U
b9a0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b9b0: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
b9c0: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
b9d0: 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63  c int pagerUnloc
b9e0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
b9f0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
ba00: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ba10: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
ba20: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
ba30: 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
ba40: 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29  ->eLock==eLock )
ba50: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
ba60: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
ba70: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ba80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
ba90: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
baa0: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
bab0: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  er)==0 );.  if( 
bac0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
bad0: 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
bae0: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
baf0: 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63  =eLock );.    rc
bb00: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63   = pPager->noLoc
bb10: 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  k ? SQLITE_OK : 
bb20: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
bb30: 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63  pPager->fd, eLoc
bb40: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  k);.    if( pPag
bb50: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
bb60: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  WN_LOCK ){.     
bb70: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
bb80: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
bb90: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
bba0: 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  UNLOCK %p %d\n",
bbb0: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bbc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bbd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
bbe0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bbf0: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
bc00: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
bc10: 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f  either SHARED_LO
bc20: 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f  CK,.** RESERVED_
bc30: 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56  LOCK or EXCLUSIV
bc40: 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63  E_LOCK. If the c
bc50: 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73  aller is success
bc60: 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20  ful, set the.** 
bc70: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
bc80: 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20  able to the new 
bc90: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a  locking state. .
bca0: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
bcb0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
bcc0: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
bcd0: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
bce0: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61  nction is .** ca
bcf0: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
bd00: 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68  ify it unless th
bd10: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
bd20: 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45  ate is EXCLUSIVE
bd30: 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74  _LOCK. .** See t
bd40: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
bd50: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
bd60: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
bd70: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
bd80: 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  .** of this..*/.
bd90: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bda0: 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  LockDb(Pager *pP
bdb0: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
bdc0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bdd0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
bde0: 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  t( eLock==SHARED
bdf0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
be00: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
be10: 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
be20: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
be30: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c  pPager->eLock<eL
be40: 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ock || pPager->e
be50: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
be60: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  CK ){.    rc = p
be70: 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20  Pager->noLock ? 
be80: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
be90: 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
bea0: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
beb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bec0: 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e  _OK && (pPager->
bed0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
bee0: 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  OCK||eLock==EXCL
bef0: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20  USIVE_LOCK) ){. 
bf00: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
bf10: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
bf20: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
bf30: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bf40: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bf50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bf60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
bf70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
bf80: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
bf90: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
bfa0: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
bfb0: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
bfc0: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
bfd0: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
bfe0: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
bff0: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
c000: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
c010: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
c020: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
c030: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
c040: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
c050: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
c060: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
c070: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
c080: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c090: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
c0a0: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
c0b0: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
c0c0: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
c0d0: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
c0e0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
c0f0: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
c100: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
c110: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
c120: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
c130: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c140: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
c150: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
c160: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
c170: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
c180: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
c190: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
c1a0: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
c1b0: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
c1c0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
c1d0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
c1e0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c1f0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
c200: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
c210: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
c220: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
c230: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c240: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
c250: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
c260: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
c270: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c280: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c290: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
c2a0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
c2b0: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
c2e0: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
c2f0: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
c320: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
c330: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c350: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
c360: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
c370: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
c380: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
c390: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
c3a0: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
c3b0: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
c3c0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
c3d0: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
c3e0: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
c3f0: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
c400: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c410: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
c420: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
c430: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c440: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
c450: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
c460: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
c470: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
c480: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
c490: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
c4a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c4b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c4c0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c4d0: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
c4e0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
c4f0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
c500: 65 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  e jrnlBufferSize
c510: 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 0.#endif../*
c520: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
c530: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
c540: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
c550: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
c560: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
c570: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
c580: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
c590: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
c5a0: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
c5b0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
c5c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
c5d0: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
c5e0: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
c5f0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
c600: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
c610: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
c620: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
c630: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
c640: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
c650: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
c660: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
c670: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
c680: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
c690: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
c6a0: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
c6b0: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
c6c0: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
c6d0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c6e0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
c6f0: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
c700: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
c710: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
c720: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
c730: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
c740: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
c750: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c760: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
c770: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c780: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
c790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
c7a0: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
c7b0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
c7c0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
c7d0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c7e0: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
c7f0: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
c800: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
c810: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c820: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
c830: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
c840: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
c850: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
c860: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
c870: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
c880: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
c890: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
c8a0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
c8b0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
c8c0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
c8d0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
c8e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c8f0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
c900: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
c910: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
c920: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
c930: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
c940: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
c950: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
c960: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
c970: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
c980: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
c990: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
c9a0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
c9b0: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
c9c0: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
c9d0: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
c9e0: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
c9f0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
ca00: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
ca10: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
ca20: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
ca30: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
ca40: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
ca50: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
ca60: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ca70: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
ca80: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
ca90: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
caa0: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
cab0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
cac0: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
cad0: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
cae0: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
caf0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
cb00: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
cb10: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
cb20: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cb30: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
cb40: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
cb50: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
cb60: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
cb70: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
cb80: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
cb90: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
cba0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
cbb0: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
cbc0: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
cbd0: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
cbe0: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
cbf0: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
cc00: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
cc10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
cc20: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
cc30: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
cc40: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
cc50: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
cc60: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
cc70: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
cc80: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
cc90: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
cca0: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
ccb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
ccc0: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
ccd0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
cce0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
ccf0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cd00: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
cd10: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
cd20: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
cd30: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
cd40: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
cd50: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
cd60: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
cd70: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
cd80: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
cd90: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
cda0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
cdb0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
cdc0: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
cdd0: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
cde0: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
cdf0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
ce00: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
ce10: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
ce20: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
ce30: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
ce40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
ce50: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
ce60: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
ce70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
ce80: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
ce90: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
cea0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
ceb0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
cec0: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
ced0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
cee0: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
cef0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
cf20: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
cf50: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
cf60: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
cf70: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf90: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
cfa0: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
cfb0: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
cfc0: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
cfd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
cfe0: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
cff0: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
d000: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
d030: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d040: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
d050: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
d060: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
d070: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
d080: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
d090: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
d0a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d0b0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d0c0: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
d0d0: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
d0e0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d0f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d100: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
d110: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
d120: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65  Master .   || le
d130: 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49  n==0 .   || SQLI
d140: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
d150: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
d160: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
d170: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d180: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d190: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
d1a0: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
d1b0: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
d1c0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
d1d0: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
d1e0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d1f0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
d200: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
d210: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
d220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
d240: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
d250: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
d260: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
d270: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
d280: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
d290: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
d2a0: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
d2b0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
d2c0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
d2d0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
d2e0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
d2f0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
d300: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
d310: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
d320: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
d330: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
d340: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
d350: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
d360: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
d370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
d380: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
d390: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
d3a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
d3b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
d3c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
d3d0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
d3e0: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
d3f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d400: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
d410: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
d420: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
d430: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d440: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
d450: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
d460: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
d470: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
d480: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
d490: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
d4a0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
d4b0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
d4c0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
d4d0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
d4e0: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
d4f0: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
d590: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
d5a0: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
d5b0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
d5c0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
d5d0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
d5e0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
d5f0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
d600: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d610: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d620: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d630: 2f 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 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d650: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d660: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d670: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d680: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d690: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d6a0: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d6b0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d6c0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d6d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d6e0: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d6f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d700: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d710: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d720: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d730: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d740: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d750: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d760: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d770: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d780: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d790: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d7a0: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d7b0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d7c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d7d0: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d7e0: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d7f0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d800: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d810: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d820: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d830: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d840: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d850: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d860: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d870: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d880: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d890: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d8a0: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d8b0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d8c0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d8d0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d8e0: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d8f0: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d900: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d910: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d920: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d930: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d940: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
d950: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
d960: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d970: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
d980: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
d990: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
d9a0: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
d9b0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
d9c0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
d9d0: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
d9e0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
d9f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
da00: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
da10: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
da20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
da30: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
da40: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
da50: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
da60: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
da70: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
da80: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
da90: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
daa0: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
dab0: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
dac0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
dad0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
dae0: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
daf0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
db00: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
db10: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
db20: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
db50: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
db60: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
db70: 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
db80: 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e  t( !sqlite3Journ
db90: 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
dba0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
dbb0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
dbc0: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
dbd0: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
dbe0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
dbf0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
dc00: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
dc10: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
dc20: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
dc30: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
dc40: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
dc50: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
dc60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dc70: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
dc80: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
dc90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dca0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
dcb0: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
dcc0: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
dcd0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
dce0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
dcf0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
dd00: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
dd10: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dd20: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
dd30: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
dd40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dd50: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
dd60: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
dd70: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
dd80: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
dd90: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
dda0: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
ddb0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
ddc0: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
ddd0: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
dde0: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
ddf0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
de00: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
de10: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
de20: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
de30: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
de40: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
de50: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
de60: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
de70: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
de80: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
de90: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
dea0: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
deb0: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
dec0: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
ded0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
dee0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
def0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
df00: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
df10: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
df20: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
df30: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
df40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
df50: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
df60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
df70: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
df80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
df90: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dfa0: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
dfb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dfc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dfd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dfe0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
dff0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
e000: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e010: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
e020: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
e030: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
e040: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
e050: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e060: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
e070: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
e080: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
e090: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
e0a0: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
e0b0: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
e0c0: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
e0d0: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
e0e0: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
e0f0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
e100: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
e110: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
e120: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
e130: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
e140: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
e150: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
e160: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
e170: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
e180: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
e190: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
e1a0: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
e1b0: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
e1c0: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
e1d0: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
e1e0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
e1f0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
e200: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e210: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
e220: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
e230: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
e240: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
e250: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
e260: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e280: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e290: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
e2a0: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
e2b0: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
e2c0: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
e2d0: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
e2e0: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
e2f0: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
e300: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
e310: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
e320: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
e330: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
e340: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
e350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e360: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
e370: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e380: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e3b0: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e3c0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e3d0: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e3e0: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e3f0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e400: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e410: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e420: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e430: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e440: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e450: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e460: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e470: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e480: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e490: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e4a0: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e4b0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e4c0: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e4d0: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e4e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e4f0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e500: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e510: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e520: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e530: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e540: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e550: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e560: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e570: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e580: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e590: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e5a0: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e5b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e5c0: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e5d0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e5e0: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e5f0: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e600: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e610: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e620: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e630: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e640: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e650: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e660: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e670: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e680: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e690: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e6a0: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e6b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e6c0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e6d0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e6e0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e6f0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e700: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e710: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e720: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e730: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e740: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e750: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e760: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e770: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e780: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e790: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e7a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e7b0: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e7c0: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e7d0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e7e0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e7f0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e800: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e810: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e820: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e830: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e840: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e850: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e870: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e880: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e890: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e8a0: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e8b0: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e8c0: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e8d0: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e8e0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e8f0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e900: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e910: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e920: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e930: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e940: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
e950: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e960: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
e970: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
e980: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
e990: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
e9a0: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
e9b0: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
e9c0: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
e9d0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
e9e0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e9f0: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
ea00: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
ea10: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
ea20: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
ea30: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ea40: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ea50: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
ea60: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
ea70: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
ea80: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
ea90: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
eaa0: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
eab0: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
eac0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
ead0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eae0: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
eaf0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
eb00: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
eb10: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
eb20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
eb30: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
eb40: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
eb50: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
eb60: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
eb70: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
eb80: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
eb90: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
eba0: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
ebb0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
ebc0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
ebd0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
ebe0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
ebf0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
ec00: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ec10: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
ec20: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
ec30: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
ec40: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ec50: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ec60: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
ec70: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
ec80: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
ec90: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
eca0: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
ecb0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ecc0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ecd0: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
ece0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
ecf0: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
ed00: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
ed10: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
ed20: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ed30: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
ed40: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
ed50: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
ed60: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
ed70: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ed80: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ed90: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
eda0: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
edb0: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
edc0: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
edd0: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ede0: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
edf0: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
ee00: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
ee10: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
ee20: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
ee30: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
ee40: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
ee50: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ee60: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
ee70: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
ee80: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
ee90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eea0: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
eeb0: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
eec0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
eed0: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
eee0: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
eef0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
ef00: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
ef10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
ef20: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
ef30: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ef40: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
ef50: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
ef60: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
ef70: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
ef80: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
ef90: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
efa0: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
efb0: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
efc0: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
efd0: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
efe0: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
eff0: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
f000: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
f010: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
f020: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
f030: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
f040: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
f050: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
f060: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
f070: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
f080: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
f090: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
f0a0: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
f0b0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f0c0: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
f0d0: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
f0e0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
f0f0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
f100: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
f110: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
f120: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
f130: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
f140: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
f150: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
f160: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
f170: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
f180: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
f190: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
f1a0: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
f1b0: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
f1c0: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
f1d0: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
f1e0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f1f0: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
f200: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
f210: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f220: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
f230: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
f240: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
f250: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
f260: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
f270: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
f280: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
f290: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
f2a0: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
f2b0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
f2c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f2d0: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
f2e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
f2f0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
f300: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
f310: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
f320: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
f330: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f340: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
f350: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
f360: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
f370: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f380: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f390: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f3a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f3b0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f3c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f3d0: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f3e0: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f3f0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f400: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f410: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f420: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f430: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f440: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f450: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f460: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f470: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f480: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f490: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f4a0: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f4b0: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f4c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f4d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f4e0: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f4f0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f500: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f510: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f520: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f530: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f540: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f550: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f560: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f570: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f580: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f590: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f5a0: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f5b0: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f5c0: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f5d0: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f5e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f5f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f600: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f610: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f620: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f630: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f640: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f650: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f660: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f670: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f680: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f690: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f6a0: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f6b0: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f6c0: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f6d0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f6e0: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f6f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f700: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f710: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f720: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f740: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f750: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f760: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f780: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f790: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f7a0: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f7b0: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f7c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f7d0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f7e0: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f7f0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f810: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f820: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f830: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f840: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f870: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f880: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f890: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f8a0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f8b0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f8c0: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f8e0: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f8f0: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f900: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f910: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f920: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f930: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f940: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
f950: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
f960: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
f970: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
f980: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
f990: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
f9a0: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
f9b0: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
f9c0: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
f9d0: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
f9e0: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
f9f0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
fa00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa10: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
fa20: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
fa30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
fa40: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
fa50: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
fa60: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
fa70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fa80: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
fa90: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
faa0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
fab0: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
fac0: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
fad0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fae0: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
faf0: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
fb00: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
fb10: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
fb20: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
fb30: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
fb40: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
fb50: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
fb60: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fb70: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
fb80: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
fb90: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
fba0: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
fbb0: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
fbc0: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
fbd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
fbe0: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
fbf0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
fc00: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
fc10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
fc20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fc30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fc40: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
fc50: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
fc60: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
fc70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fc80: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
fc90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
fca0: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
fcb0: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
fcc0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fcd0: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
fce0: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
fcf0: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
fd00: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
fd10: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
fd20: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
fd30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fd40: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
fd50: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
fd60: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
fd70: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
fd80: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd90: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fda0: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
fdb0: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
fdc0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fdd0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fde0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
fdf0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
fe00: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
fe10: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fe20: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fe30: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fe40: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
fe50: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fe60: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
fe70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
fe80: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
fe90: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
fea0: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
feb0: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
fec0: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
fed0: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fef0: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
ff00: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
ff10: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
ff20: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
ff30: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
ff40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
ff50: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
ff60: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
ff70: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
ff80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
ff90: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
ffa0: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
ffb0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ffc0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
ffd0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
ffe0: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
fff0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
10000 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10010 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
10020 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
10030 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
10040 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
10050 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
10060 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
10070 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
10080 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
10090 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
100a0 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
100b0 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
100c0 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
100d0 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
100e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
100f0 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
10100 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
10110 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
10130 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
10140 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
10150 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
10160 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
10170 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
10180 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
10190 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
101a0 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
101b0 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
101c0 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
101d0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
101e0 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
101f0 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
10200 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
10210 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
10220 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
10230 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
10240 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10250 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
10260 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
10270 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
10280 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
10290 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
102a0 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
102b0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
102c0 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
102d0 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
102e0 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
102f0 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
10300 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
10310 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10320 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
10330 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
10340 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
10350 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
10360 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
10370 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10380 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10390 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
103a0 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
103b0 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
103c0 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
103d0 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
103e0 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
103f0 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10410 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
10420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10430 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10440 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10450 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
10460 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10470 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10480 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10490 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
104a0 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
104b0 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
104c0 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
104d0 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
104e0 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
104f0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10500 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10510 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
10520 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
10530 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
10540 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10550 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10560 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10570 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10580 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10590 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
105a0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
105b0 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
105c0 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
105d0 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
105e0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
105f0 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10600 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10610 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
10620 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
10630 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
10640 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10650 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10660 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10670 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10680 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10690 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
106a0 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
106b0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
106c0 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
106d0 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
106e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
106f0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10700 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10710 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
10720 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
10730 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10740 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10750 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10760 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10770 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10780 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10790 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
107a0 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
107b0 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
107c0 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
107d0 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
107e0 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
107f0 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
10800 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10810 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
10820 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
10830 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
10840 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10850 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10860 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
10870 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10880 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10890 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
108a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
108b0 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
108c0 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
108d0 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
108e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
108f0 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10900 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10910 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10920 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
10930 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
10940 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
10950 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10960 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
10970 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10980 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10990 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
109a0 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
109b0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
109c0 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
109d0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
109e0 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
109f0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10a00 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10a10 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
10a20 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
10a30 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
10a40 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
10a50 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
10a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
10a70 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10a80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10a90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10aa0 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10ad0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10ae0 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b00 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10b10 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
10b20 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
10b50 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
10b60 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
10b70 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10b90 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10ba0 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10bb0 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10be0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10c00 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10c10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
10c20 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
10c30 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
10c40 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
10c50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10c60 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10c70 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10c80 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
10c90 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20  ->jfd).  ){.    
10ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10cb0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10cc0 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
10cd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10ce0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
10cf0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10d00 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
10d10 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
10d20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
10d30 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
10d40 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10d50 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10d60 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10d70 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10d80 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10d90 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10da0 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10db0 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10dc0 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10dd0 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10de0 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
10df0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10e00 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
10e10 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
10e20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
10e30 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10e40 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10e50 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
10e60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
10e70 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
10e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10e90 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
10ea0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
10eb0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10ec0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10ed0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
10ee0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
10ef0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
10f00 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
10f10 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
10f20 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
10f30 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
10f40 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
10f50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
10f60 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
10f70 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10f80 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
10f90 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
10fa0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10fb0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
10fc0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
10fd0 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
10fe0 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
10ff0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11000 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
11010 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
11020 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
11030 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
11040 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11050 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11060 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11070 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
11080 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11090 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
110a0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
110b0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
110c0 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d      iHdrOff+4+nM
110f0 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
11100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11110 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
11120 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
11130 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
11140 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11150 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
11160 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
11170 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
11180 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
11190 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
111a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
111b0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
111c0 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
111d0 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
111e0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
111f0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
11200 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
11210 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
11220 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
11230 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
11240 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
11250 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
11260 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11270 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
11280 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
11290 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
112a0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
112b0 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
112c0 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
112d0 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
112e0 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
112f0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
11300 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
11310 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
11320 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
11330 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
11340 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11350 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
11360 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
11370 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
11380 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
11390 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
113a0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
113b0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
113c0 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
113d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
113e0 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
113f0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11400 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11410 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11420 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
11430 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
11440 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69  er){.  pPager->i
11450 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20  DataVersion++;. 
11460 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
11470 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
11480 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65  ackup);.  sqlite
11490 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
114a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
114b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
114c0 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  he pPager->iData
114d0 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f  Version value.*/
114e0 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65  .u32 sqlite3Page
114f0 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67  rDataVersion(Pag
11500 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
11510 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
11520 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
11530 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
11540 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11550 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n;.}../*.** Free
11560 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11570 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11580 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11590 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
115a0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
115b0 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
115c0 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
115d0 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
115e0 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
115f0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
11600 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11610 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
11620 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
11630 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11640 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11650 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11670 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11680 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11690 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
116a0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
116b0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
116c0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
116d0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
116e0 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
116f0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
11700 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
11710 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
11720 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
11730 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
11740 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ory(pPager->sjfd
11750 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11760 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11770 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11780 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
11790 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
117a0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
117b0 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
117c0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
117d0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
117e0 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
117f0 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
11800 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
11810 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
11820 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
11830 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
11840 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11850 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11860 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
11870 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
11880 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
11890 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
118a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
118b0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
118c0 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
118d0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
118e0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
118f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11900 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11910 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11920 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
11930 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
11940 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11950 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11960 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
11970 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
11980 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11990 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
119a0 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
119b0 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
119c0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
119d0 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
119e0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
119f0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
11a00 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
11a10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
11a20 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
11a30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11a40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11a50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11a70 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
11a80 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11a90 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
11aa0 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
11ab0 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
11ac0 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
11ad0 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
11ae0 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
11af0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
11b00 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11b10 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
11b20 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
11b30 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
11b40 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
11b50 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
11b60 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
11b70 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
11b80 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
11b90 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
11ba0 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
11bb0 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
11bc0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
11bd0 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
11be0 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
11bf0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
11c00 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
11c10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11c20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
11c30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11c40 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
11c50 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
11c60 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
11c70 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
11c80 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
11c90 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
11ca0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
11cb0 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
11cc0 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
11cd0 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
11ce0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
11cf0 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
11d00 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
11d10 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
11d20 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
11d30 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
11d40 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
11d50 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
11d60 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
11d70 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
11d80 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
11d90 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
11da0 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
11db0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11dc0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
11dd0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
11de0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
11df0 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
11e00 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11e10 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
11e20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11e30 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
11e40 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
11e50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
11e60 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41   = 0;.  releaseA
11e70 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
11e80 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ger);..  if( pag
11e90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
11ea0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11eb0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
11ec0 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  jfd) );.    sqli
11ed0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
11ee0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
11ef0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  >pWal);.    pPag
11f00 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
11f10 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  ER_OPEN;.  }else
11f20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11f30 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
11f40 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72   /* Error code r
11f70 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72  eturned by pager
11f80 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20  UnlockDb() */.  
11f90 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
11fa0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
11fb0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
11fc0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
11fd0 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
11fe0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
11ff0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
12000 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
12010 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
12020 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
12030 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12040 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
12050 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
12060 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
12070 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
12080 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
12090 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
120a0 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
120b0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
120c0 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
120d0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
120e0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
120f0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
12100 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12110 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12120 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
12130 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12140 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12150 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
12160 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
12170 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12180 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
12190 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
121a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
121b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
121c0 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
121d0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
121e0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
121f0 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
12200 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
12210 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
12220 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
12230 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
12240 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
12250 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
12260 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
12270 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
12280 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
12290 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
122a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
122b0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
122c0 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  d the call to un
122d0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
122e0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61  e.    ** file fa
122f0 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72  ils, set the cur
12300 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b  rent lock to UNK
12310 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
12320 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a  he comment.    *
12330 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  * above the #def
12340 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f  ine for UNKNOWN_
12350 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
12360 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74  anation of why t
12370 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65  his.    ** is ne
12380 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
12390 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
123a0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e  lockDb(pPager, N
123b0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
123c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
123d0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
123e0 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b  ==PAGER_ERROR ){
123f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
12400 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c  Lock = UNKNOWN_L
12410 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OCK;.    }..    
12420 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61  /* The pager sta
12430 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65  te may be change
12440 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52  d from PAGER_ERR
12450 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  OR to PAGER_OPEN
12460 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74   here.    ** wit
12470 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68  hout clearing th
12480 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
12490 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61  is is intentiona
124a0 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20  l - the error.  
124b0 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65    ** code is cle
124c0 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  ared and the cac
124d0 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20  he reset in the 
124e0 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20  block below..   
124f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12500 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12510 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
12520 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
12530 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
12540 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
12550 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
12560 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12570 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EN;.  }..  /* If
12580 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
12590 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
125a0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
125b0 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
125c0 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e  .  ** trusted. N
125d0 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ow that there ar
125e0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
125f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
12600 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69  he pager,.  ** i
12610 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76  t can safely mov
12620 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  e back to PAGER_
12630 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73  OPEN state. This
12640 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68   happens in both
12650 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64  .  ** normal and
12660 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
12670 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng mode..  */.  
12680 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12690 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
126a0 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
126b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
126c0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  rCode ){.    if(
126d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
126e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  e==0 ){.      pa
126f0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12700 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
12710 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
12720 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
12730 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12740 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c  ER_OPEN;.    }el
12750 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
12760 2d 3e 65 53 74 61 74 65 20 3d 20 28 69 73 4f 70  ->eState = (isOp
12770 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
12780 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a 20 50  ? PAGER_OPEN : P
12790 41 47 45 52 5f 52 45 41 44 45 52 29 3b 0a 20 20  AGER_READER);.  
127a0 20 20 7d 0a 20 20 20 20 69 66 28 20 55 53 45 46    }.    if( USEF
127b0 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73  ETCH(pPager) ) s
127c0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
127d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
127e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
127f0 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
12800 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  OK;.  }..  pPage
12810 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
12820 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
12830 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70  rnalHdr = 0;.  p
12840 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
12850 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
12860 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12870 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
12880 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c  an IOERR or FULL
12890 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75   error that requ
128a0 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  ires.** the page
128b0 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20  r to transition 
128c0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
128d0 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63  tate may ahve oc
128e0 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66  curred..** The f
128f0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
12900 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12910 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
12920 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  e, the second .*
12930 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  * the error-code
12940 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
12950 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
12960 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
12970 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  he .** value ret
12980 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
12990 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
129a0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
129b0 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
129c0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
129d0 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
129e0 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f  _FULL, SQLITE_IO
129f0 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ERR or one of th
12a00 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63  e.** IOERR sub-c
12a10 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20  odes, the pager 
12a20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52  enters the ERROR
12a30 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65   state and the e
12a40 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
12a50 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
12a60 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74  errCode. While t
12a70 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73  he pager remains
12a80 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
12a90 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f  ate,.** all majo
12aa0 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  r API calls on t
12ab0 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  he Pager will im
12ac0 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
12ad0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a   Pager.errCode..
12ae0 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20  **.** The ERROR 
12af0 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20  state indicates 
12b00 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
12b10 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
12b20 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
12b30 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
12b40 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
12b50 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
12b60 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
12b70 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
12b80 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12b90 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
12ba0 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
12bb0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
12bc0 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
12bd0 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
12be0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12bf0 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
12c00 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
12c10 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
12c20 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
12c30 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
12c40 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
12c50 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
12c60 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
12c70 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
12c80 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
12c90 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
12ca0 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
12cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
12cc0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
12cd0 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
12ce0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12cf0 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
12d00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12d10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
12d20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
12d30 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
12d40 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
12d50 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
12d60 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
12d70 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
12d80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
12d90 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70  Code = rc;.    p
12da0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12db0 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d  PAGER_ERROR;.  }
12dc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12de0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
12df0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
12e00 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  Page);../*.** Th
12e10 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  e write transact
12e20 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ion open on the 
12e30 70 61 67 65 72 20 70 61 73 73 65 64 20 61 73 20  pager passed as 
12e40 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
12e50 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 63 6f  t is.** being co
12e60 6d 6d 69 74 74 65 64 2e 20 54 68 69 73 20 66 75  mmitted. This fu
12e70 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
12e80 72 75 65 20 69 66 20 61 6c 6c 20 64 69 72 74 79  rue if all dirty
12e90 20 70 61 67 65 73 20 73 68 6f 75 6c 64 0a 2a 2a   pages should.**
12ea0 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64   be flushed to d
12eb0 69 73 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  isk, or false ot
12ec0 68 65 72 77 69 73 65 2e 20 50 61 67 65 73 20 73  herwise. Pages s
12ed0 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68 65 64  hould be flushed
12ee0 20 74 6f 20 64 69 73 6b 0a 2a 2a 20 75 6e 6c 65   to disk.** unle
12ef0 73 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ss one of the fo
12f00 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
12f10 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  .**.**   * The d
12f20 62 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  b is an in-memor
12f30 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
12f40 2a 20 20 20 2a 20 54 68 65 20 64 62 20 69 73 20  *   * The db is 
12f50 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
12f60 62 61 73 65 20 61 6e 64 20 74 68 65 20 64 62 20  base and the db 
12f70 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
12f80 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  n opened..**.** 
12f90 20 20 2a 20 54 68 65 20 64 62 20 69 73 20 61 20    * The db is a 
12fa0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
12fb0 73 65 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  se and the cache
12fc0 20 63 6f 6e 74 61 69 6e 73 20 6c 65 73 73 20 74   contains less t
12fd0 68 61 6e 0a 2a 2a 20 20 20 20 20 43 2f 34 20 64  han.**     C/4 d
12fe0 69 72 74 79 20 70 61 67 65 73 2c 20 77 68 65 72  irty pages, wher
12ff0 65 20 43 20 69 73 20 74 68 65 20 63 6f 6e 66 69  e C is the confi
13000 67 75 72 65 64 20 63 61 63 68 65 2d 73 69 7a 65  gured cache-size
13010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13020 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d  pagerFlushOnComm
13030 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
13040 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
13050 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  >tempFile==0 ) r
13060 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21  eturn 1;.  if( !
13070 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
13080 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  d) ) return 0;. 
13090 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33   return (sqlite3
130a0 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69 72  PCachePercentDir
130b0 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
130c0 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a  he)>=25);.}../*.
130d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
130e0 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
130f0 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
13100 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
13110 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
13120 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
13130 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
13140 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
13150 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
13160 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
13170 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
13180 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
13190 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
131a0 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
131b0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
131c0 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
131d0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
131e0 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
131f0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
13200 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
13210 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
13220 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45  alled in PAGER_E
13230 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69  RROR state. If i
13240 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69  t is called.** i
13250 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20  n PAGER_NONE or 
13260 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
13270 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  te and the lock 
13280 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20  held is less.** 
13290 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61  exclusive than a
132a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
132b0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
132c0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
132d0 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70  any active savep
132e0 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73  oints are releas
132f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
13300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13310 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69   open, then it i
13320 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f  s "finalized". O
13330 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a  nce a journal .*
13340 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  * file has been 
13350 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20  finalized it is 
13360 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
13370 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62  use it to roll b
13380 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61  ack a .** transa
13390 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20  ction. Nor will 
133a0 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  it be considered
133b0 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75   to be a hot-jou
133c0 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20  rnal by this.** 
133d0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74  or any other dat
133e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
133f0 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20  . Exactly how a 
13400 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13410 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20  ized.** depends 
13420 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
13430 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  t the pager is r
13440 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
13450 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20  ive mode and.** 
13460 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
13470 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e  nal-mode (Pager.
13480 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75  journalMode valu
13490 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  e), as follows:.
134a0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
134b0 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20  ode==MEMORY.**  
134c0 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
134d0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69  descriptor is si
134e0 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69  mply closed. Thi
134f0 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a  s destroys an .*
13500 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20  *     in-memory 
13510 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20  journal..**.**  
13520 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52   journalMode==TR
13530 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f  UNCATE.**     Jo
13540 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72  urnal file is tr
13550 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
13560 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
13570 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13580 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20  de==PERSIST.**  
13590 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20     The first 28 
135a0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
135b0 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65  rnal file are ze
135c0 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c  roed. This inval
135d0 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68  idates.**     th
135e0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
135f0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69  header in the fi
13600 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68  le, and hence th
13610 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
13620 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e  .**     file. An
13630 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   invalid journal
13640 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20   file cannot be 
13650 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
13660 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13670 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  ==DELETE.**     
13680 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13690 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   is closed and d
136a0 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c  eleted using sql
136b0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
136c0 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65  **.**     If the
136d0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
136e0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
136f0 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64  ode, this method
13700 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a   of finalizing.*
13710 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
13720 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
13730 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69  used. Instead, i
13740 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64  f the journalMod
13750 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45  e is.**     DELE
13760 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  TE and the pager
13770 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
13780 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f   mode, the metho
13790 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65  d described unde
137a0 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c  r.**     journal
137b0 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73  Mode==PERSIST is
137c0 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
137d0 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a  *.** After the j
137e0 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
137f0 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d  zed, the pager m
13800 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45  oves to PAGER_RE
13810 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49  ADER state..** I
13820 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
13830 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62  -exclusive rollb
13840 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ack mode, the lo
13850 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  ck on the file i
13860 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64  s .** downgraded
13870 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43   to a SHARED_LOC
13880 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
13890 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
138a0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
138b0 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
138c0 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20  ccurs during.** 
138d0 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70  any of the IO op
138e0 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61  erations to fina
138f0 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
13900 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20   file or unlock 
13910 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
13920 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
13930 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
13940 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
13950 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61  If the .** opera
13960 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65  tion to finalize
13970 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13980 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  e fails, then th
13990 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20  e code still.** 
139a0 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  tries to unlock 
139b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
139c0 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c  e if not in excl
139d0 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74  usive mode. If t
139e0 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65  he.** unlock ope
139f0 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20  ration fails as 
13a00 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66  well, then the f
13a10 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20  irst error code 
13a20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  related.** to th
13a30 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e  e first error en
13a40 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a  countered (the j
13a50 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13a60 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72  ion one) is.** r
13a70 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
13a80 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
13a90 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
13aa0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13ab0 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62  hasMaster, int b
13ac0 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72  Commit){.  int r
13ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13ae0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13af0 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
13b00 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
13b10 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
13b20 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
13b30 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13b40 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
13b50 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13b60 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
13b70 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
13b80 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
13b90 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
13ba0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
13bb0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
13bc0 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
13bd0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
13be0 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
13bf0 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
13c00 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
13c10 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
13c20 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
13c30 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
13c40 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
13c50 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
13c60 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
13c70 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
13c80 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
13c90 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
13ca0 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
13cb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
13cc0 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
13cd0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
13ce0 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
13cf0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
13d00 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
13d10 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
13d20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
13d30 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
13d40 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
13d50 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
13d60 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
13d70 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
13d80 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
13d90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
13da0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
13db0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
13dc0 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
13dd0 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
13de0 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
13df0 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
13e00 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
13e10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
13e20 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
13e30 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
13e40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
13e50 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
13e60 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
13e70 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
13e80 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
13e90 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
13ea0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
13eb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13ec0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
13ed0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
13ee0 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
13ef0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13f00 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
13f10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
13f20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
13f30 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
13f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
13f50 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13f60 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
13f70 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13f80 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
13f90 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
13fa0 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
13fb0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13fc0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61    /* assert( pPa
13fd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13fe0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13ff0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f  ODE_MEMORY ); */
14000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
14010 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
14020 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
14030 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14040 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14050 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
14060 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
14070 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14080 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
14090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
140a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
140b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
140c0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
140d0 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
140e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
140f0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
14100 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
14110 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
14120 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c  sure the new fil
14130 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74 65  e size is writte
14140 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65  n into the inode
14150 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
14160 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
14170 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ise the journal 
14180 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74 20  might resurrect 
14190 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
141a0 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20  r loss and.     
141b0 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
141c0 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69  e last transacti
141d0 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  on to roll back.
141e0 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20 20    See.          
141f0 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  ** https://bugzi
14200 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f  lla.mozilla.org/
14210 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
14220 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20 20  1072773.        
14230 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
14240 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
14250 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
14260 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
14270 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14280 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
14290 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
142a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
142b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
142c0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
142d0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
142e0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
142f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14300 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
14310 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
14320 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
14330 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
14340 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
14350 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
14360 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  r||pPager->tempF
14370 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ile);.      pPag
14380 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14390 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
143a0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
143b0 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
143c0 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
143d0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
143e0 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
143f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
14400 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
14410 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
14420 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
14430 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
14440 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
14450 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
14460 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
14470 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
14480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
14490 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
144a0 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
144b0 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  y journal..     
144c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
144d0 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d  elete = !pPager-
144e0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20  >tempFile;.     
144f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14500 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14510 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d  y(pPager->jfd)==
14520 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
14530 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14540 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14550 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
14560 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
14570 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14580 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14590 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
145a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
145b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
145c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
145d0 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
145e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
145f0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14600 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
14610 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
14620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14630 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
14640 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
14650 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65  urnal, pPager->e
14660 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20 20  xtraSync);.     
14670 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
14680 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
14690 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
146a0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
146b0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
146c0 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
146d0 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
146e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
146f0 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
14700 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
14710 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
14720 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
14730 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
14740 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
14750 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
14760 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
14770 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
14780 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
14790 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l(p);.    }.  }.
147a0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
147b0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
147c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
147d0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
147e0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
147f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
14800 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
14810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
14820 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
14830 6c 65 20 7c 7c 20 28 62 43 6f 6d 6d 69 74 20 26  le || (bCommit &
14840 26 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f  & pagerFlushOnCo
14850 6d 6d 69 74 28 70 50 61 67 65 72 29 29 20 29 7b  mmit(pPager)) ){
14860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
14870 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
14880 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
14890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
148a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
148b0 61 72 57 72 69 74 61 62 6c 65 28 70 50 61 67 65  arWritable(pPage
148c0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
148d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63   }.    sqlite3Pc
148e0 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
148f0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
14900 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
14910 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
14920 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
14930 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
14940 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c   WAL write-lock,
14950 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69   if any. Also, i
14960 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
14970 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20   was in .    ** 
14980 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
14990 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20  lusive mode but 
149a0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72  is no longer, dr
149b0 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
149c0 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65   .    ** lock he
149d0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
149e0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
149f0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
14a00 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
14a10 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
14a20 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
14a30 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
14a40 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  K );.  }else if(
14a50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14a60 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61  & bCommit && pPa
14a70 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
14a80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
14a90 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72  {.    /* This br
14aa0 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
14ab0 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
14ac0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72  transaction in r
14ad0 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a  ollback-journal.
14ae0 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74      ** mode if t
14af0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14b00 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67   on disk is larg
14b10 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
14b20 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
14b30 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  ** At this point
14b40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
14b50 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
14b60 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
14b70 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63  ion .    ** succ
14b80 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74  essfully committ
14b90 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c  ed, but the EXCL
14ba0 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74  USIVE lock is st
14bb0 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  ill held on the.
14bc0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20      ** file. So 
14bd0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72  it is safe to tr
14be0 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
14bf0 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20  ase file to its 
14c00 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72  minimum.    ** r
14c10 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a  equired size.  *
14c20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
14c30 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
14c40 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
14c50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
14c60 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
14c70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
14c80 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
14c90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d  QLITE_OK && bCom
14ca0 6d 69 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50  mit && isOpen(pP
14cb0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
14cc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
14cd0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
14ce0 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
14cf0 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45  NTL_COMMIT_PHASE
14d00 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  TWO, 0);.    if(
14d10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
14d20 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49  OUND ) rc = SQLI
14d30 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
14d40 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
14d50 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
14d60 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  (!pagerUseWal(pP
14d70 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33  ager) || sqlite3
14d80 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
14d90 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30  (pPager->pWal, 0
14da0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20  )).  ){.    rc2 
14db0 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
14dc0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
14dd0 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
14de0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
14df0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  e = 0;.  }.  pPa
14e00 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
14e10 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50  GER_READER;.  pP
14e20 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
14e30 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28  = 0;..  return (
14e40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
14e50 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
14e60 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
14e70 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
14e80 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
14e90 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
14ea0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14eb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14ec0 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
14ed0 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
14ee0 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  R state, do not 
14ef0 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
14f00 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
14f10 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
14f20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
14f30 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
14f40 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
14f50 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
14f60 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
14f70 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
14f80 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14f90 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74   file and move t
14fa0 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f  he pager back to
14fb0 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20   OPEN state. If 
14fc0 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74  this .** means t
14fd0 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 68  hat there is a h
14fe0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ot-journal left 
14ff0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
15000 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a  em, the next .**
15010 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f   connection to o
15020 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
15030 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72  ock on the pager
15040 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74   (which may be t
15050 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c  his one) .** wil
15060 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  l roll it back..
15070 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
15080 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  er has not alrea
15090 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
150a0 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
150b0 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c  an IO or.** mall
150c0 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
150d0 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
150e0 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c  k, then this wil
150f0 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a  l itself cause .
15100 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
15110 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
15120 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c  state. Which wil
15130 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  l be cleared by 
15140 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  the.** call to p
15150 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61  ager_unlock(), a
15160 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
15170 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
15180 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
15190 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
151a0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
151b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
151c0 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50  AGER_ERROR && pP
151d0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
151e0 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
151f0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
15200 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
15210 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  r) );.    if( pP
15220 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
15230 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
15240 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
15250 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
15260 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  loc();.      sql
15270 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
15280 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
15290 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
152a0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d  nMalloc();.    }
152b0 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
152c0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
152d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
152e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
152f0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
15300 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64  .      pager_end
15310 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
15320 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
15330 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  }.  }.  pager_un
15340 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a  lock(pPager);.}.
15350 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
15360 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e   aData must poin
15370 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
15380 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15390 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
153a0 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  ta. Compute and 
153b0 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
153c0 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20  m based ont the 
153d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
153e0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61  .** page of data
153f0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
15400 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72   value of pPager
15410 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a  ->cksumInit..**.
15420 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
15430 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
15440 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
15450 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
15460 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
15470 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65  ial value (pPage
15480 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e  r->cksumInit) an
15490 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79  d every 200th by
154a0 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  te.** of the pag
154b0 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67  e data, starting
154c0 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65   with byte offse
154d0 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t (pPager->pageS
154e0 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63  ize%200)..** Eac
154f0 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70  h byte is interp
15500 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69  reted as an 8-bi
15510 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  t unsigned integ
15520 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69  er..**.** Changi
15530 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75  ng the formula u
15540 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
15550 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73  his checksum res
15560 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  ults in an.** in
15570 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e  compatible journ
15580 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  al file format..
15590 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c  **.** If journal
155a0 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
155b0 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
155c0 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
155d0 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73  ost likely .** s
155e0 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20  cenario is that 
155f0 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
15600 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
15610 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
15620 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75  ed. .** It is mu
15630 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
15640 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
15650 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
15660 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
15670 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
15680 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
15690 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
156a0 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
156b0 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
156c0 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
156d0 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
156e0 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
156f0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
15700 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
15710 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
15720 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a  ager, const u8 *
15730 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
15740 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
15750 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
15760 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c   /* Checksum val
15770 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
15780 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
15790 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20  ->pageSize-200; 
157a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
157b0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68   counter */.  wh
157c0 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
157d0 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
157e0 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
157f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
15800 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
15810 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  port the current
15820 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e   page size and n
15830 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
15840 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20  d bytes back.** 
15850 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f  to the codec..*/
15860 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
15870 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20  AS_CODEC.static 
15880 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74  void pagerReport
15890 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
158a0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
158b0 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
158c0 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  g ){.    pPager-
158d0 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28  >xCodecSizeChng(
158e0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20  pPager->pCodec, 
158f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15900 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
15920 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  t)pPager->nReser
15930 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  ve);.  }.}.#else
15940 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52  .# define pagerR
15950 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20  eportSize(X)    
15960 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20   /* No-op if we 
15970 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
15980 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66   codec */.#endif
15990 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
159a0 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
159b0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 75  Make sure the nu
159c0 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
159d0 20 62 69 74 73 20 69 73 20 74 68 65 20 73 61 6d   bits is the sam
159e0 65 20 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61  e in the destina
159f0 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73  tion.** pager as
15a00 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 73 6f   it is in the so
15a10 75 72 63 65 2e 20 20 54 68 69 73 20 63 6f 6d 65  urce.  This come
15a20 73 20 75 70 20 77 68 65 6e 20 61 20 56 41 43 55  s up when a VACU
15a30 55 4d 20 63 68 61 6e 67 65 73 20 74 68 65 0a 2a  UM changes the.*
15a40 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  * number of rese
15a50 72 76 65 64 20 62 69 74 73 20 74 6f 20 74 68 65  rved bits to the
15a60 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e   "optimal" amoun
15a70 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
15a80 65 33 50 61 67 65 72 41 6c 69 67 6e 52 65 73 65  e3PagerAlignRese
15a90 72 76 65 28 50 61 67 65 72 20 2a 70 44 65 73 74  rve(Pager *pDest
15aa0 2c 20 50 61 67 65 72 20 2a 70 53 72 63 29 7b 0a  , Pager *pSrc){.
15ab0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 52 65    if( pDest->nRe
15ac0 73 65 72 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65  serve!=pSrc->nRe
15ad0 73 65 72 76 65 20 29 7b 0a 20 20 20 20 70 44 65  serve ){.    pDe
15ae0 73 74 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 70  st->nReserve = p
15af0 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20  Src->nReserve;. 
15b00 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
15b10 7a 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d  ze(pDest);.  }.}
15b20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
15b30 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67  ead a single pag
15b40 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68  e from either th
15b50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
15b60 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31  if isMainJrnl==1
15b70 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  ) or.** from the
15b80 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66   sub-journal (if
15b90 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20   isMainJrnl==0) 
15ba0 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61  and playback tha
15bb0 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70  t page..** The p
15bc0 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66  age begins at of
15bd0 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e  fset *pOffset in
15be0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65  to the file. The
15bf0 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c   *pOffset.** val
15c00 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20  ue is increased 
15c10 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
15c20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
15c30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
15c40 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c  .** The main rol
15c50 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73  lback journal us
15c60 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74  es checksums - t
15c70 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
15c80 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f  rnal does .** no
15c90 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
15ca0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
15cb0 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72  he page record r
15cc0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
15cd0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
15ce0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
15cf0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
15d00 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
15d10 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62  Size, then playb
15d20 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65  ack is.** skippe
15d30 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
15d40 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
15d50 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e  ** If pDone is n
15d60 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
15d70 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20   is a record of 
15d80 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20  pages that have 
15d90 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
15da0 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66  played back.  If
15db0 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f   the page at *pO
15dc0 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64  ffset has alread
15dd0 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  y been played ba
15de0 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f  ck.** (if the co
15df0 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e  rresponding pDon
15e00 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68  e bit is set) th
15e10 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79  en skip the play
15e20 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75  back..** Make su
15e30 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74  re the pDone bit
15e40 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
15e50 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70  o the *pOffset p
15e60 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72  age is set.** pr
15e70 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67  ior to returning
15e80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
15e90 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75  age record is su
15ea0 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
15eb0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15ec0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61  ournal file.** a
15ed0 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20  nd played back, 
15ee0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
15ef0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
15f00 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
15f10 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69  s.** while readi
15f20 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72  ng the record fr
15f30 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
15f40 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69  rnal file or whi
15f50 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f  le writing.** to
15f60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15f70 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  le, then the IO 
15f80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
15f90 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a  turned. If data.
15fa0 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ** is successful
15fb0 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
15fc0 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15fd0 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20  ile but appears 
15fe0 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74  to be.** corrupt
15ff0 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
16000 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74  is returned. Dat
16010 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  a is considered 
16020 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20  corrupted in.** 
16030 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
16040 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66  s:.** .**   * If
16050 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65   the record page
16060 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67  -number is illeg
16070 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d  al (0 or PAGER_M
16080 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20  J_PGNO), or.**  
16090 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
160a0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
160b0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
160c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
160d0 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20  .**     and the 
160e0 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64  checksum field d
160f0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
16100 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74  e record content
16110 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20  ..**.** Neither 
16120 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65  of these two sce
16130 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69  narios are possi
16140 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76  ble during a sav
16150 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  epoint rollback.
16160 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
16170 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  s a savepoint ro
16180 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d  llback, then mem
16190 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20  ory may have to 
161a0 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a  be dynamically.*
161b0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
161c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  his function. If
161d0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
161e0 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74  e and an allocat
161f0 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51  ion fails,.** SQ
16200 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
16210 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
16220 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
16230 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
16240 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16260 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e  * The pager bein
16270 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  g played back */
16280 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
162b0 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
162c0 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
162d0 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  one,            
162e0 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66      /* Bitvec of
162f0 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70   pages already p
16300 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
16310 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20  int isMainJrnl, 
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16330 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e   1 -> main journ
16340 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75  al. 0 -> sub-jou
16350 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  rnal. */.  int i
16360 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20  sSavepnt        
16370 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16380 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74   for a savepoint
16390 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a   rollback */.){.
163a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
163b0 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
163c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
163d0 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
163e0 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
163f0 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16410 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
16420 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
16430 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
16440 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
16450 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
16460 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
16470 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
16480 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20  .  char *aData; 
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74   /* Temporary st
164b0 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61  orage for the pa
164c0 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ge */.  sqlite3_
164d0 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
164e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
164f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
16500 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
16510 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e  e */.  int isSyn
16520 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ced;            
16530 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
16540 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20  journal page is 
16550 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73  synced */..  ass
16560 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
16570 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
16580 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
16590 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
165a0 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
165b0 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
165c0 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
165d0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
165e0 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
165f0 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
16600 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
16610 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
16620 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
16630 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
16640 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
16650 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
16660 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
16670 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70   */..  aData = p
16680 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
16690 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
166a0 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  a );         /* 
166b0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73  Temp storage mus
166c0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
166d0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
166e0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
166f0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
16700 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e  0 || (!isMainJrn
16710 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20  l && isSavepnt) 
16720 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20  );..  /* Either 
16730 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65  the state is gre
16740 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f  ater than PAGER_
16750 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
16760 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  (a transaction .
16770 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
16780 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20  t rollback done 
16790 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f  at the request o
167a0 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72  f the caller) or
167b0 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20   this is.  ** a 
167c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
167d0 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61  back. If it is a
167e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
167f0 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72  lback, the pager
16800 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74  .  ** is in stat
16810 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73  e OPEN and holds
16820 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
16830 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ck. Hot-journal 
16840 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e  rollback.  ** on
16850 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68  ly reads from th
16860 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  e main journal, 
16870 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  not the sub-jour
16880 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
16890 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
168a0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
168b0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
168c0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74   || (pPager->eSt
168d0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
168e0 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
168f0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
16900 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ).  );.  assert(
16910 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
16920 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
16930 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e  CHEMOD || isMain
16940 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  Jrnl );..  /* Re
16950 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
16960 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61  er and page data
16970 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
16980 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
16990 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75  .  ** file. Retu
169a0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
169b0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
169c0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
169d0 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64  curs..  */.  jfd
169e0 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20   = isMainJrnl ? 
169f0 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
16a00 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63  ager->sjfd;.  rc
16a10 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
16a20 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67  d, *pOffset, &pg
16a30 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
16a40 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
16a50 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
16a60 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
16a70 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
16a80 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a  er->pageSize, (*
16a90 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69  pOffset)+4);.  i
16aa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16ab0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16ac0 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67  *pOffset += pPag
16ad0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
16ae0 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b   + isMainJrnl*4;
16af0 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
16b00 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
16b10 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
16b20 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
16b30 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
16b40 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
16b50 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
16b60 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
16b70 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
16b80 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
16b90 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
16ba0 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
16bb0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
16bc0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
16bd0 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
16be0 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
16bf0 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
16c00 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
16c10 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
16c20 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
16c30 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
16c40 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
16c50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
16c60 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
16c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
16c80 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
16c90 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d  no>(Pgno)pPager-
16ca0 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74  >dbSize || sqlit
16cb0 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f  e3BitvecTest(pDo
16cc0 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  ne, pgno) ){.   
16cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16ce0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d  K;.  }.  if( isM
16cf0 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72  ainJrnl ){.    r
16d00 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
16d10 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34  fd, (*pOffset)-4
16d20 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
16d30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
16d40 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61  c;.    if( !isSa
16d50 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63  vepnt && pager_c
16d60 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
16d70 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  *)aData)!=cksum 
16d80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16d90 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
16da0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
16db0 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c  this page has al
16dc0 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
16dd0 64 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75  d back before du
16de0 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
16df0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20  .  ** rollback, 
16e00 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65  then don't bothe
16e10 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  r to play it bac
16e20 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  k again..  */.  
16e30 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
16e40 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
16e50 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
16e60 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
16e70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16e80 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c   }..  /* When pl
16e90 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20  aying back page 
16ea0 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e  1, restore the n
16eb0 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a  Reserve setting.
16ec0 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
16ed0 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  =1 && pPager->nR
16ee0 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44  eserve!=((u8*)aD
16ef0 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20  ata)[20] ){.    
16f00 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
16f10 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b   = ((u8*)aData)[
16f20 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65  20];.    pagerRe
16f30 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
16f40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
16f50 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43  he pager is in C
16f60 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74  ACHEMOD state, t
16f70 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
16f80 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
16f90 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
16fa0 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
16fb0 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
16fc0 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
16fd0 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
16fe0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
16ff0 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
17000 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
17010 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
17020 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
17030 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
17040 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
17050 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
17060 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
17070 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
17080 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
17090 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
170a0 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
170b0 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
170c0 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
170d0 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
170e0 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
170f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
17100 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
17110 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
17120 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
17130 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
17140 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
17150 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
17160 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
17170 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
17180 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
17190 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
171a0 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54  .  ** If in WRIT
171b0 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52  ER_DBMOD, WRITER
171c0 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45  _FINISHED or OPE
171d0 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  N state, then we
171e0 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a   update the.  **
171f0 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
17200 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68  it exists and th
17210 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
17220 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
17230 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64  rked .  ** not d
17240 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73  irty. Since this
17250 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78   code is only ex
17260 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f  ecuted in PAGER_
17270 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20  OPEN state for. 
17280 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
17290 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
172a0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
172b0 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  t the page-cache
172c0 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69   is empty.  ** i
172d0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
172e0 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  n OPEN state..  
172f0 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
17300 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
17310 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
17320 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
17330 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
17340 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
17350 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
17360 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
17370 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
17380 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
17390 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
173a0 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
173b0 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
173c0 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
173d0 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
173e0 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
173f0 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
17400 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
17410 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
17420 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
17430 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
17440 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
17450 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
17460 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
17470 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
17480 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
17490 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
174a0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
174b0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
174c0 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
174d0 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
174e0 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
174f0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
17500 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
17510 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
17520 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
17530 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
17540 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
17550 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
17560 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
17570 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
17580 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
17590 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
175a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
175b0 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
175c0 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
175d0 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
175e0 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
175f0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
17600 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
17610 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
17620 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
17630 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
17640 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
17650 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
17660 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
17670 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
17680 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
17690 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
176a0 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
176b0 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
176c0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
176d0 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
176e0 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
176f0 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
17700 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
17710 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
17720 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
17730 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
17740 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
17750 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
17760 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
17770 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
17780 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  er) ){.    pPg =
17790 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
177a0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
177b0 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
177c0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61  , pgno);.  }.  a
177d0 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d  ssert( pPg || !M
177e0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
177f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
17800 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  !=PAGER_OPEN || 
17810 70 50 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  pPg==0 || pPager
17820 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
17830 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
17840 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
17850 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
17860 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41  ",.           PA
17870 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
17880 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
17890 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
178a0 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61  Size, (u8*)aData
178b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69  ),.           (i
178c0 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
178d0 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
178e0 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
178f0 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
17900 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
17910 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
17920 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20  || (*pOffset <= 
17930 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
17940 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
17950 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50    isSynced = (pP
17960 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
17970 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
17980 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a  EED_SYNC));.  }.
17990 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
179a0 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28  ger->fd).   && (
179b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
179c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
179d0 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
179e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
179f0 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64  ).   && isSynced
17a00 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
17a10 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
17a20 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
17a30 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ize;.    testcas
17a40 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  e( !isSavepnt &&
17a50 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d   pPg!=0 && (pPg-
17a60 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
17a70 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20  D_SYNC)!=0 );.  
17a80 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
17a90 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
17aa0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
17ab0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
17ac0 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74  ->fd, (u8 *)aDat
17ad0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17ae0 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  ize, ofst);.    
17af0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
17b00 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
17b10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
17b20 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
17b30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
17b40 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
17b50 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50  .      CODEC1(pP
17b60 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
17b70 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
17b80 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20  NOMEM_BKPT);.   
17b90 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
17ba0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
17bb0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
17bc0 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
17bd0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
17be0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
17bf0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rc=SQLITE_NOMEM_
17c00 42 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a 20 20  BKPT, aData);.  
17c10 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17c20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
17c30 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
17c40 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
17c50 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
17c60 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
17c70 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
17c80 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
17c90 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
17ca0 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
17cb0 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
17cc0 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
17cd0 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
17ce0 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
17cf0 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
17d00 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
17d10 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
17d20 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
17d30 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
17d40 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
17d50 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
17d60 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
17d70 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
17d80 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
17d90 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
17da0 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
17db0 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
17dc0 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
17dd0 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
17de0 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
17df0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
17e00 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
17e10 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
17e20 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
17e30 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
17e40 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
17e50 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
17e60 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
17e70 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
17e80 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
17e90 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
17ea0 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
17eb0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
17ec0 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
17ed0 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
17ee0 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
17ef0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
17f00 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
17f10 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
17f20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
17f30 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
17f40 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
17f50 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
17f60 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
17f70 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
17f80 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
17f90 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
17fa0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17fb0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
17fc0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
17fd0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
17fe0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
17ff0 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)==0 );.    pPa
18000 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
18010 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  |= SPILLFLAG_ROL
18020 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  LBACK;.    rc = 
18030 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
18040 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
18050 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Pg, 1);.    asse
18060 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
18070 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
18080 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30  LAG_ROLLBACK)!=0
18090 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
180a0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53  doNotSpill &= ~S
180b0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
180c0 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  K;.    if( rc!=S
180d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
180e0 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66  n rc;.    pPg->f
180f0 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
18100 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71  EED_READ;.    sq
18110 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
18120 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
18130 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
18140 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
18150 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
18160 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
18170 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
18180 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
18190 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
181a0 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
181b0 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
181c0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
181d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
181e0 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
181f0 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
18200 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
18210 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
18220 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
18230 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
18240 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
18250 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
18260 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
18270 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
18280 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
18290 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
182a0 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
182b0 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61  py(pData, (u8*)a
182c0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
182d0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  geSize);.    pPa
182e0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
182f0 50 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75  Pg);.    /* It u
18300 73 65 64 20 74 6f 20 62 65 20 74 68 61 74 20 73  sed to be that s
18310 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
18320 43 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20 63  Clean(pPg) was c
18330 61 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74  alled here.  But
18340 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c  .    ** that cal
18350 6c 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20  l was dangerous 
18360 61 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63  and had no detec
18370 74 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69  table benefit si
18380 6e 63 65 20 74 68 65 20 63 61 63 68 65 0a 20 20  nce the cache.  
18390 20 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79    ** is normally
183a0 20 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69   cleaned by sqli
183b0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
183c0 6c 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  l() after rollba
183d0 63 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a  ck and so.    **
183e0 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
183f0 64 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  d. */.    pager_
18400 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
18410 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
18420 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
18430 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
18440 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
18450 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
18460 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
18470 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
18480 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
18490 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
184a0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
184b0 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
184c0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
184d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
184e0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
184f0 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
18500 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
18510 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
18520 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
18530 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
18540 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
18550 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 73 71  EM_BKPT);.    sq
18560 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
18570 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
18580 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18590 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
185a0 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
185b0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
185c0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
185d0 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
185e0 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
185f0 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
18600 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
18610 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
18620 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
18630 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
18640 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
18650 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
18660 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18670 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
18680 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
18690 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
186a0 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
186b0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
186c0 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
186d0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
186e0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
186f0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
18700 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
18710 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18720 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
18730 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
18740 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
18750 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
18760 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
18770 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
18780 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
18790 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
187a0 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
187b0 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
187c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
187d0 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
187e0 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
187f0 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
18800 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
18810 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
18820 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
18830 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
18840 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
18850 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
18860 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
18870 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
18880 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
18890 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
188a0 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
188b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
188c0 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
188d0 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
188e0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
188f0 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
18900 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
18910 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
18920 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
18930 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18940 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
18950 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
18960 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
18970 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
18980 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
18990 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
189a0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
189b0 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
189c0 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
189d0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
189e0 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
189f0 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
18a00 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
18a10 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
18a20 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
18a30 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
18a40 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
18a50 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
18a60 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
18a70 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
18a80 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
18a90 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
18aa0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
18ab0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
18ac0 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
18ad0 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
18ae0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
18af0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
18b00 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
18b10 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
18b20 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
18b30 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
18b40 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
18b50 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
18b60 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
18b70 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
18b80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
18b90 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
18ba0 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
18bb0 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
18bc0 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
18bd0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
18be0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
18bf0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
18c00 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
18c10 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
18c20 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
18c30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18c40 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
18c50 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
18c60 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
18c70 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
18c80 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
18c90 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
18ca0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
18cb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18cc0 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
18cd0 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
18ce0 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
18cf0 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
18d00 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
18d10 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
18d20 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
18d30 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18d40 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18d50 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
18d60 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18d70 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18d80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18da0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18db0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
18dc0 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
18dd0 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
18de0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18df0 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
18e00 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
18e10 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
18e20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
18e30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
18e40 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18e50 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
18e60 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
18e70 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18e80 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
18e90 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
18ea0 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
18eb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18ec0 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
18ed0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
18ee0 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
18ef0 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
18f00 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18f10 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
18f20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
18f30 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
18f40 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
18f50 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
18f60 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18f70 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
18f80 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
18f90 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
18fa0 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
18fb0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
18fc0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
18fd0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
18fe0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
18ff0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
19000 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
19010 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
19020 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
19030 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
19040 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
19050 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
19060 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
19070 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
19080 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
19090 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
190a0 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
190b0 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
190c0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
190d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
190e0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
190f0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
19100 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
19110 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
19120 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
19130 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
19140 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
19150 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
19160 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
19170 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
19180 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
19190 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
191a0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
191b0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
191c0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
191d0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
191e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
191f0 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
19200 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
19210 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f  ournal.   Also o
19220 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69  btain.  ** suffi
19230 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20  cient space (in 
19240 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68  zMasterPtr) to h
19250 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  old the names of
19260 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75   master.  ** jou
19270 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61  rnal files extra
19280 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61  cted from regula
19290 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  r rollback-journ
192a0 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  als..  */.  rc =
192b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
192c0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
192d0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
192e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
192f0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19300 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65  er_out;.  nMaste
19310 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50  rPtr = pVfs->mxP
19320 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61  athname+1;.  zMa
19330 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  sterJournal = sq
19340 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73  lite3Malloc(nMas
19350 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
19360 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
19370 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
19380 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
19390 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
193a0 54 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  T;.    goto delm
193b0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20  aster_out;.  }. 
193c0 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a   zMasterPtr = &z
193d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
193e0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b  asterJournal+1];
193f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
19400 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
19410 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28  MasterJournal, (
19420 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
19430 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  al, 0);.  if( rc
19440 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
19450 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19460 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
19470 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
19480 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72  l] = 0;..  zJour
19490 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
194a0 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  rnal;.  while( (
194b0 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
194c0 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
194d0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
194e0 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72  nt exists;.    r
194f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
19500 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
19510 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
19520 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
19530 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
19540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19550 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
19560 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
19570 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20   if( exists ){. 
19580 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
19590 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
195a0 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
195b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
195c0 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70  sts..      ** Op
195d0 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
195e0 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
195f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19600 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  al. If.      ** 
19610 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
19620 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
19630 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19640 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ile..      */.  
19650 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
19660 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
19670 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
19680 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
19690 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
196a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
196b0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
196c0 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
196d0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
196e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
196f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
19700 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19710 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
19720 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
19730 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61  rJournal(pJourna
19740 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e  l, zMasterPtr, n
19750 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
19760 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19770 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
19780 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19790 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
197a0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
197b0 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
197c0 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
197d0 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70  [0]!=0 && strcmp
197e0 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
197f0 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
19800 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
19810 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
19820 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
19830 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
19840 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
19850 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
19860 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
19870 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f   }.    }.    zJo
19880 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65  urnal += (sqlite
19890 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e  3Strlen30(zJourn
198a0 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20  al)+1);.  }. .  
198b0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
198c0 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20  Master);.  rc = 
198d0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
198e0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
198f0 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
19900 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
19910 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
19920 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72  );.  if( pMaster
19930 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
19940 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
19950 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
19960 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29  Open(pJournal) )
19970 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
19980 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(pMaster);.  }
19990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
199a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
199b0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
199c0 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75   change the actu
199d0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
199e0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
199f0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
19a00 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68  tem. This only h
19a10 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d  appens when comm
19a20 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
19a30 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c  tion,.** or roll
19a40 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73  ing back a trans
19a50 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e  action (includin
19a60 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  g rolling back a
19a70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
19a80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e  *.** If the main
19a90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
19aa0 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74  s not open, or t
19ab0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
19ac0 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d  in either.** DBM
19ad0 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65  OD or OPEN state
19ae0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
19af0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
19b00 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20  rwise, the size 
19b10 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20  .** of the file 
19b20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50  is changed to nP
19b30 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65  age pages (nPage
19b40 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
19b50 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66  e bytes). .** If
19b60 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
19b70 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c  k is currently l
19b80 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65  arger than nPage
19b90 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65   pages, then use
19ba0 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75   the VFS.** xTru
19bb0 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74  ncate() method t
19bc0 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a  o truncate it..*
19bd0 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68  *.** Or, it migh
19be0 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
19bf0 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  at the file on d
19c00 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  isk is smaller t
19c10 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61  han .** nPage pa
19c20 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74  ges. Some operat
19c30 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65  ing system imple
19c40 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67  mentations can g
19c50 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a  et confused if .
19c60 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72  ** you try to tr
19c70 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
19c80 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
19c90 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
19ca0 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  t .** currently 
19cb0 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68  is, so detect th
19cc0 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74  is case and writ
19cd0 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20  e a single zero 
19ce0 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20  byte to .** the 
19cf0 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66  end of the new f
19d00 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ile instead..**.
19d10 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
19d20 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
19d30 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  OK. If an IO err
19d40 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
19d50 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65  modifying.** the
19d60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
19d70 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
19d80 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
19d90 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
19da0 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
19db0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
19dc0 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
19dd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19de0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
19df0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
19e00 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
19e10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
19e20 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41  State!=PAGER_REA
19e30 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20  DER );.  .  if( 
19e40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
19e50 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65  d) .   && (pPage
19e60 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
19e70 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
19e80 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
19e90 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20  =PAGER_OPEN) .  
19ea0 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
19eb0 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
19ec0 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20  .    int szPage 
19ed0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
19ee0 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
19ef0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
19f00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
19f10 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
19f20 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
19f30 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
19f40 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
19f50 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
19f60 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
19f70 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
19f80 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a      newSize = sz
19f90 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Page*(i64)nPage;
19fa0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19fb0 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
19fc0 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
19fd0 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
19fe0 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
19ff0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a000 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
1a010 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
1a020 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
1a030 6c 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74  lse if( (current
1a040 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65  Size+szPage)<=ne
1a050 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
1a060 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50   char *pTmp = pP
1a070 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1a080 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
1a090 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29  pTmp, 0, szPage)
1a0a0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1a0b0 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
1a0c0 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53  age) == currentS
1a0d0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ize );.        t
1a0e0 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
1a0f0 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72  e-szPage) >  cur
1a100 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
1a110 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a120 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1a130 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65  fd, pTmp, szPage
1a140 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65  , newSize-szPage
1a150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1a180 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
1a190 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
1a1a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
1a1b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a1c0 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74  * Return a sanit
1a1d0 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
1a1e0 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
1a1f0 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65  of OS file pFile
1a200 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  . The.** return 
1a210 76 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74  value is guarant
1a220 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65  eed to lie betwe
1a230 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45  en 32 and MAX_SE
1a240 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e  CTOR_SIZE..*/.in
1a250 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  t sqlite3SectorS
1a260 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1a270 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
1a280 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73  iRet = sqlite3Os
1a290 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65  SectorSize(pFile
1a2a0 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32  );.  if( iRet<32
1a2b0 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35   ){.    iRet = 5
1a2c0 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  12;.  }else if( 
1a2d0 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  iRet>MAX_SECTOR_
1a2e0 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65  SIZE ){.    asse
1a2f0 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  rt( MAX_SECTOR_S
1a300 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20  IZE>=512 );.    
1a310 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f  iRet = MAX_SECTO
1a320 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65  R_SIZE;.  }.  re
1a330 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn iRet;.}../*
1a340 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
1a350 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73  e of the Pager.s
1a360 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
1a370 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  le for the given
1a380 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20  .** pager based 
1a390 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  on the value ret
1a3a0 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
1a3b0 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a  ctorSize method.
1a3c0 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64  ** of the open d
1a3d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1a3e0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
1a3f0 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74  ll be used .** t
1a400 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1a410 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65  size and alignme
1a420 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  nt of journal he
1a430 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73  ader and .** mas
1a440 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
1a450 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61  ters within crea
1a460 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ted journal file
1a470 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
1a480 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65  porary files the
1a490 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a4a0 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73  r size is always
1a4b0 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a   512 bytes..**.*
1a4c0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  * Otherwise, for
1a4d0 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66   non-temporary f
1a4e0 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74  iles, the effect
1a4f0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1a500 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  is.** the value 
1a510 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1a520 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65  xSectorSize() me
1a530 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20  thod rounded up 
1a540 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69  to 32 if.** it i
1a550 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20  s less than 32, 
1a560 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20  or rounded down 
1a570 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  to MAX_SECTOR_SI
1a580 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67  ZE if it.** is g
1a590 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f  reater than MAX_
1a5a0 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a  SECTOR_SIZE..**.
1a5b0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68  ** If the file h
1a5c0 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  as the SQLITE_IO
1a5d0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1a5e0 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79  ERWRITE property
1a5f0 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68  , then set.** th
1a600 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1a610 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d  or size to its m
1a620 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31  inimum value (51
1a630 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  2).  The purpose
1a640 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73   of.** pPager->s
1a650 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20  ectorSize is to 
1a660 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73  define the "blas
1a670 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74  t radius" of byt
1a680 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  es that.** might
1a690 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61   change if a cra
1a6a0 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  sh occurs while 
1a6b0 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e  writing to a sin
1a6c0 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74  gle byte in.** t
1a6d0 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20  hat range.  But 
1a6e0 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f  with POWERSAFE_O
1a6f0 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c  VERWRITE, the bl
1a700 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65  ast radius is ze
1a710 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77  ro.** (that is w
1a720 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  hat POWERSAFE_OV
1a730 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20  ERWRITE means), 
1a740 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  so we minimize t
1a750 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a  he sector.** siz
1a760 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64  e.  For backward
1a770 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
1a780 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1a790 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1a7a0 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f  mat,.** we canno
1a7b0 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  t reduce the eff
1a7c0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1a7d0 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f  ze below 512..*/
1a7e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1a7f0 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
1a800 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
1a810 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1a820 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1a830 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
1a840 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
1a850 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71  mpFile.   || (sq
1a860 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1a870 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1a880 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20  ger->fd) & .    
1a890 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1a8a0 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1a8b0 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20  _OVERWRITE)!=0. 
1a8c0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
1a8d0 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
1a8e0 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
1a8f0 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
1a900 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
1a910 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
1a920 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
1a930 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
1a940 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
1a950 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
1a960 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20   segfault. */.  
1a970 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
1a980 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65  Size = 512;.  }e
1a990 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
1a9a0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
1a9b0 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
1a9c0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
1a9d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
1a9e0 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
1a9f0 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
1aa00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1aa10 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
1aa20 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
1aa30 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
1aa40 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
1aa50 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
1aa60 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
1aa70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
1aa80 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
1aa90 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
1aaa0 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
1aab0 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
1aac0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1aad0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1aae0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
1aaf0 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
1ab00 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
1ab10 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
1ab20 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
1ab30 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
1ab40 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
1ab50 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
1ab60 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
1ab70 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
1ab80 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
1ab90 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1aba0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1abb0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
1abc0 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
1abd0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
1abe0 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
1abf0 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
1ac00 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1ac10 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
1ac20 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
1ac30 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
1ac40 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
1ac50 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62  *  (5)  4 byte b
1ac60 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1ac70 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
1ac80 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65  ector size.  The
1ac90 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20   header.**      
1aca0 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79   is this many by
1acb0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
1acc0 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67   (6)  4 byte big
1acd0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1ace0 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67  which is the pag
1acf0 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20  e size..**  (7) 
1ad00 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75   zero padding ou
1ad10 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  t to the next se
1ad20 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  ctor size..**  (
1ad30 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  8)  Zero or more
1ad40 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
1ad50 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
1ad60 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
1ad70 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
1ad80 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
1ad90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ada0 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
1adb0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1adc0 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
1add0 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
1ade0 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
1adf0 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
1ae00 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65   the first 7 ite
1ae10 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
1ae20 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
1ae30 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
1ae40 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68  tance of the 8th
1ae50 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
1ae60 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
1ae70 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
1ae80 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
1ae90 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1aea0 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
1aeb0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
1aec0 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
1aed0 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
1aee0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
1aef0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
1af00 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
1af10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1af20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
1af30 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
1af40 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
1af50 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
1af60 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
1af70 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
1af80 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
1af90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1afa0 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
1afb0 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
1afc0 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
1afd0 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
1afe0 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
1aff0 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
1b000 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
1b010 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1b020 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
1b030 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
1b040 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
1b050 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
1b060 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
1b070 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
1b080 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
1b090 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
1b0a0 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
1b0b0 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
1b0c0 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
1b0d0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
1b0e0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1b0f0 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
1b100 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
1b110 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
1b120 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
1b130 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
1b140 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
1b150 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
1b160 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
1b170 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
1b180 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
1b190 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
1b1a0 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
1b1b0 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
1b1c0 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
1b1d0 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
1b1e0 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
1b1f0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1b200 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
1b210 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
1b220 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
1b230 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
1b240 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
1b250 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
1b260 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
1b270 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
1b280 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
1b290 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1b2a0 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
1b2b0 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
1b2c0 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
1b2d0 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
1b2e0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
1b2f0 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
1b300 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
1b310 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
1b320 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
1b330 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
1b340 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
1b350 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
1b360 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
1b370 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1b380 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1b390 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61  * The isHot para
1b3a0 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
1b3b0 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69  that we are tryi
1b3c0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ng to rollback a
1b3d0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74   journal.** that
1b3e0 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20   might be a hot 
1b3f0 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74  journal.  Or, it
1b400 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74   could be that t
1b410 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a  he journal is .*
1b420 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61  * preserved beca
1b430 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f  use of JOURNALMO
1b440 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f  DE_PERSIST or JO
1b450 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
1b460 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  TE..** If the jo
1b470 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20  urnal really is 
1b480 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70  hot, reset the p
1b490 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72  ager cache prior
1b4a0 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b   rolling.** back
1b4b0 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49   any content.  I
1b4c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  f the journal is
1b4d0 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65   merely persiste
1b4e0 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a  nt, no reset is.
1b4f0 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ** needed..*/.st
1b500 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
1b510 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
1b520 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
1b530 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1b540 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1b550 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
1b560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b570 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1b580 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
1b590 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
1b5a0 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
1b5b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b5c0 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
1b5d0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
1b5e0 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
1b5f0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
1b600 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
1b610 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
1b620 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1b630 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
1b640 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
1b650 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1b680 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
1b690 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
1b6a0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
1b6b0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1b6c0 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63   by sqlite3OsAcc
1b6d0 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ess() */.  char 
1b6e0 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
1b6f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
1b700 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1b710 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69  le if any */.  i
1b720 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  nt needPagerRese
1b730 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
1b740 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72  to reset page pr
1b750 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67  ior to first pag
1b760 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  e rollback */.  
1b770 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20  int nPlayback = 
1b780 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61  0;       /* Tota
1b790 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
1b7a0 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20  s restored from 
1b7b0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a  journal */..  /*
1b7c0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1b7d0 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
1b7e0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1b7f0 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
1b800 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
1b810 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
1b820 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1b830 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
1b840 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1b850 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1b860 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
1b870 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b880 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
1b890 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
1b8a0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1b8b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
1b8c0 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
1b8d0 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
1b8e0 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
1b8f0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1b900 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
1b910 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
1b920 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
1b930 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
1b940 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
1b950 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
1b960 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
1b970 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
1b980 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ed back..  **.  
1b990 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63  ** TODO: Technic
1b9a0 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ally the followi
1b9b0 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62  ng is an error b
1b9c0 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65  ecause it assume
1b9d0 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66  s that.  ** buff
1b9e0 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  er Pager.pTmpSpa
1b9f0 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d  ce is (mxPathnam
1ba00 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61  e+1) bytes or la
1ba10 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a  rger. i.e. that.
1ba20 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61    ** (pPager->pa
1ba30 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  geSize >= pPager
1ba40 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1ba50 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f  me+1). Using os_
1ba60 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50  unix.c,.  ** mxP
1ba70 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20  athname is 512, 
1ba80 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d  which is the sam
1ba90 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  e as the minimum
1baa0 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65   allowable value
1bab0 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69  .  ** for pageSi
1bac0 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ze..  */.  zMast
1bad0 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1bae0 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
1baf0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1bb00 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1bb10 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1bb20 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1bb30 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
1bb40 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1bb50 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
1bb60 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1bb70 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
1bb80 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1bb90 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
1bba0 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
1bbb0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1bbc0 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
1bbd0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1bbe0 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
1bbf0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1bc00 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72  = 0;.  needPager
1bc10 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a  Reset = isHot;..
1bc20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
1bc30 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
1bc40 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72   when a readJour
1bc50 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a  nalHdr() or .  *
1bc60 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
1bc70 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c  _one_page() call
1bc80 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1bc90 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
1bca0 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73  ror .  ** occurs
1bcb0 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
1bcc0 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61   1 ){.    /* Rea
1bcd0 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
1bce0 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
1bcf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1bd00 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
1bd10 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
1bd20 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
1bd30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1bd40 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
1bd50 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
1bd60 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
1bd70 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
1bd80 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1bd90 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
1bda0 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
1bdb0 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
1bdc0 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
1bdd0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
1bde0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1bdf0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
1be00 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a  Pager, isHot, sz
1be10 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
1be20 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1be30 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
1be40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1be50 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1be60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1be70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
1be80 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1be90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1bea0 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
1beb0 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
1bec0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
1bed0 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1bee0 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
1bef0 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
1bf00 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
1bf10 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
1bf20 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
1bf30 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
1bf40 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
1bf50 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
1bf60 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
1bf70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
1bf80 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
1bf90 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
1bfa0 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
1bfb0 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
1bfc0 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
1bfd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1bfe0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1bff0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c000 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
1c010 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
1c020 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1c030 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
1c040 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1c050 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1c060 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
1c070 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
1c080 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1c090 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
1c0a0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
1c0b0 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
1c0c0 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
1c0d0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
1c0e0 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
1c0f0 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
1c100 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
1c110 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
1c120 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
1c130 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
1c140 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
1c150 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
1c160 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
1c170 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
1c180 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
1c190 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
1c1a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
1c1b0 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
1c1c0 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
1c1d0 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
1c1e0 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e  565..    ** When
1c1f0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1c200 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65  hot journal, nRe
1c210 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e  c==0 always mean
1c220 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a  s that the next.
1c230 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20      ** chunk of 
1c240 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  the journal cont
1c250 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20  ains zero pages 
1c260 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1c270 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77  k.  But.    ** w
1c280 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c  hen doing a ROLL
1c290 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65  BACK and the nRe
1c2a0 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68  c==0 chunk is th
1c2b0 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a  e last chunk in.
1c2c0 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
1c2d0 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  al, it means tha
1c2e0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  t the journal mi
1c2f0 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69  ght contain addi
1c300 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61  tional.    ** pa
1c310 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ges that need to
1c320 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1c330 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d  and that the num
1c340 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20  ber of pages .  
1c350 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63    ** should be c
1c360 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e  omputed based on
1c370 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c380 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
1c390 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26     if( nRec==0 &
1c3a0 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20  & !isHot &&.    
1c3b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1c3c0 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
1c3d0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
1c3e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c3f0 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  f ){.      nRec 
1c400 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70  = (int)((szJ - p
1c410 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c420 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
1c430 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1c440 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1c450 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1c460 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
1c470 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
1c480 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
1c490 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1c4a0 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
1c4b0 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
1c4c0 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
1c4d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1c4e0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c4f0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
1c500 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
1c510 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
1c520 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1c530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c540 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1c550 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
1c560 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c570 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
1c580 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
1c590 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
1c5a0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1c5b0 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
1c5c0 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
1c5d0 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20  ase file and/or 
1c5e0 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20  page cache..    
1c5f0 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20  */.    for(u=0; 
1c600 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20  u<nRec; u++){.  
1c610 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65      if( needPage
1c620 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
1c630 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1c640 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  ager);.        n
1c650 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1c660 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1c670 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1c680 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
1c690 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f  ager,&pPager->jo
1c6a0 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b  urnalOff,0,1,0);
1c6b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1c6c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c6d0 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b      nPlayback++;
1c6e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c6f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c700 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1c710 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1c720 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1c730 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1c740 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1c750 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1c760 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1c770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1c780 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1c790 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1c7a0 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1c7b0 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1c7c0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1c7d0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1c7e0 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1c7f0 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1c800 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1c810 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1c820 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1c830 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1c840 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1c850 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1c860 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1c870 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1c880 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1c890 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1c8a0 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1c8b0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1c8c0 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1c8d0 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1c8e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c8f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1c900 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c910 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1c920 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1c930 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1c940 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1c950 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1c960 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1c970 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1c980 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1c990 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1c9a0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1c9b0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1c9c0 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1c9d0 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1c9e0 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1c9f0 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1ca00 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1ca10 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1ca20 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1ca30 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1ca40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1ca50 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1ca60 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1ca70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1ca80 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1ca90 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1caa0 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1cab0 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
1cac0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
1cad0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1cae0 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
1caf0 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
1cb00 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
1cb10 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1cb20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
1cb30 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
1cb40 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
1cb50 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
1cb60 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
1cb70 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
1cb80 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
1cb90 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1cba0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
1cbb0 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
1cbc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1cbd0 42 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72  BUG.  if( pPager
1cbe0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
1cbf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  {.    sqlite3OsF
1cc00 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
1cc10 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
1cc20 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1cc30 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  GED,0);.  }.#end
1cc40 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  if..  /* If this
1cc50 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
1cc60 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
1cc70 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
1cc80 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
1cc90 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
1cca0 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
1ccb0 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
1ccc0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
1ccd0 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
1cce0 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
1ccf0 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
1cd00 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
1cd10 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
1cd20 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
1cd30 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
1cd40 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
1cd50 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
1cd60 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
1cd70 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
1cd80 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
1cd90 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
1cda0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
1cdb0 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
1cdc0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
1cdd0 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
1cde0 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
1cdf0 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
1ce00 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
1ce10 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
1ce20 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
1ce30 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
1ce40 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
1ce50 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
1ce60 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
1ce70 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
1ce80 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
1ce90 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
1cea0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
1ceb0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
1cec0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1ced0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
1cee0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1cef0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
1cf00 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1cf10 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1cf20 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1cf30 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1cf40 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
1cf50 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1cf60 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1cf70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
1cf80 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1cf90 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1cfa0 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1cfb0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1cfc0 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20  R_OPEN).  ){.   
1cfd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1cfe0 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30  erSync(pPager, 0
1cff0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1d000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d010 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1d020 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1d030 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
1d040 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74  ='\0', 0);.    t
1d050 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1d060 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1d070 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d080 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1d090 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a  && res ){.    /*
1d0a0 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
1d0b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
1d0c0 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
1d0d0 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
1d0e0 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
1d0f0 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
1d100 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
1d110 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
1d120 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1d130 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
1d140 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1d150 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d160 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1d170 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74  .  }.  if( isHot
1d180 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b   && nPlayback ){
1d190 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
1d1a0 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  (SQLITE_NOTICE_R
1d1b0 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c  ECOVER_ROLLBACK,
1d1c0 20 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70   "recovered %d p
1d1d0 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20  ages from %s",. 
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
1d1f0 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72  Playback, pPager
1d200 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  ->zJournal);.  }
1d210 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
1d220 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
1d230 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
1d240 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
1d250 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
1d260 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
1d270 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1d280 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
1d290 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
1d2a0 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
1d2b0 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
1d2c0 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
1d2d0 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
1d2e0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
1d2f0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1d300 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1d310 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1d320 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75   for page pPg ou
1d330 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1d340 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20  e file and into 
1d350 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20  .** pPg->pData. 
1d360 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72  A shared lock or
1d370 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
1d380 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1d390 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65  abase.** file be
1d3a0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
1d3b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
1d3c0 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73  .** If page 1 is
1d3d0 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20   read, then the 
1d3e0 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
1d3f0 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73  bFileVers[] is s
1d400 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c  et to.** the val
1d410 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
1d420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1d430 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
1d440 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1d450 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69  n the IO error i
1d460 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
1d470 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68  e caller..** Oth
1d480 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1d490 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
1d4a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
1d4b0 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70  dDbPage(PgHdr *p
1d4c0 50 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b  Pg, u32 iFrame){
1d4d0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1d4e0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20   = pPg->pPager; 
1d4f0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1d500 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d510 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67  page pPg */.  Pg
1d520 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
1d530 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  gno;       /* Pa
1d540 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61  ge number to rea
1d550 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  d */.  int rc = 
1d560 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1d570 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1d580 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a  de */.  int pgsz
1d590 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
1d5a0 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ize; /* Number o
1d5b0 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
1d5c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1d5d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1d5e0 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d  GER_READER && !M
1d5f0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
1d600 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1d610 3e 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66  >fd) );..#ifndef
1d620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1d630 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b  .  if( iFrame ){
1d640 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
1d650 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
1d660 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
1d670 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
1d680 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
1d690 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
1d6a0 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73  Wal, iFrame, pgs
1d6b0 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  z, pPg->pData);.
1d6c0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1d6d0 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73   {.    i64 iOffs
1d6e0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1d6f0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
1d700 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
1d710 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1d720 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61  er->fd, pPg->pDa
1d730 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65  ta, pgsz, iOffse
1d740 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
1d750 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1d760 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1d770 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d780 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1d790 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
1d7a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1d7b0 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20   /* If the read 
1d7c0 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  is unsuccessful,
1d7d0 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56   set the dbFileV
1d7e0 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69  ers[] to somethi
1d7f0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ng.      ** that
1d800 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
1d810 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73   valid file vers
1d820 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73  ion.  dbFileVers
1d830 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20  [] is a copy.   
1d840 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32     ** of bytes 2
1d850 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1d860 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38  abase.  Bytes 28
1d870 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61  ..31 should alwa
1d880 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a  ys be.      ** z
1d890 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20  ero or the size 
1d8a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d8b0 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33  in page. Bytes 3
1d8c0 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39  2..35 and 35..39
1d8d0 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  .      ** should
1d8e0 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73   be page numbers
1d8f0 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72   which are never
1d900 20 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f   0xffffffff.  So
1d910 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a   filling.      *
1d920 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  * pPager->dbFile
1d930 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20  Vers[] with all 
1d940 30 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c  0xff bytes shoul
1d950 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20  d suffice..     
1d960 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
1d970 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61   an encrypted da
1d980 74 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75  tabase, the situ
1d990 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f  ation is more co
1d9a0 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20  mplex:  bytes.  
1d9b0 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66      ** 24..39 of
1d9c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72   the database ar
1d9d0 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20  e white noise.  
1d9e0 42 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c  But the probabil
1d9f0 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ity of.      ** 
1da00 77 68 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61  white noise equa
1da10 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
1da20 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
1da30 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
1da40 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
1da50 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
1da60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
1da70 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
1da80 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
1da90 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1daa0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1dab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
1dac0 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
1dad0 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
1dae0 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
1daf0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1db00 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
1db10 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
1db20 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1db30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
1db40 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
1db50 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
1db60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1db70 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45  M_BKPT);..  PAGE
1db80 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1db90 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1dba0 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1dbb0 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
1dbc0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
1dbd0 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1dbe0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41  er, pgno));.  PA
1dbf0 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48  GERTRACE(("FETCH
1dc00 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
1dc10 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1dc20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1dc30 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
1dc40 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1dc50 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  pPg)));..  retur
1dc60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
1dc70 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20  pdate the value 
1dc80 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  of the change-co
1dc90 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73  unter at offsets
1dca0 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a   24 and 92 in.**
1dcb0 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
1dcc0 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69  the sqlite versi
1dcd0 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66  on number at off
1dce0 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68  set 96..**.** Th
1dcf0 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69  is is an uncondi
1dd00 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20  tional update.  
1dd10 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67  See also the pag
1dd20 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1dd30 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69  unter().** routi
1dd40 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70  ne which only up
1dd50 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1dd60 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20  -counter if the 
1dd70 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c  update is actual
1dd80 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73  ly.** needed, as
1dd90 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
1dda0 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  he pPager->chang
1ddb0 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65  eCountDone state
1ddc0 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74   variable..*/.st
1ddd0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
1dde0 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
1ddf0 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ter(PgHdr *pPg){
1de00 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
1de10 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63  unter;..  /* Inc
1de20 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
1de30 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
1de40 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
1de50 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68  byte 24. */.  ch
1de60 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
1de70 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
1de80 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d  u8*)pPg->pPager-
1de90 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a  >dbFileVers)+1;.
1dea0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1deb0 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1dec0 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  24, change_count
1ded0 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20  er);..  /* Also 
1dee0 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65  store the SQLite
1def0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
1df00 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20  in bytes 96..99 
1df10 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65  and in.  ** byte
1df20 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74  s 92..95 store t
1df30 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1df40 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
1df50 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20  version number. 
1df60 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f   ** is valid. */
1df70 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1df80 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1df90 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +92, change_coun
1dfa0 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74  ter);.  put32bit
1dfb0 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1dfc0 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45  Data)+96, SQLITE
1dfd0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29  _VERSION_NUMBER)
1dfe0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1dff0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
1e000 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e010 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
1e020 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74   for each page t
1e030 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
1e040 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e  been .** written
1e050 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69   into the log fi
1e060 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72  le when a WAL tr
1e070 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1e080 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72  led back..** Par
1e090 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68  ameter iPg is th
1e0a0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1e0b0 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20   said page. The 
1e0c0 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a  pCtx argument .*
1e0d0 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  * is actually a 
1e0e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
1e0f0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a  ager structure..
1e100 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50  **.** If page iP
1e110 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  g is present in 
1e120 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68  the cache, and h
1e130 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
1e140 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a  g references,.**
1e150 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64   it is discarded
1e160 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1e170 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
1e180 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e   more outstandin
1e190 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c  g.** references,
1e1a0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1e1b0 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72  t is reloaded fr
1e1c0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1e1d0 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d   If the.** attem
1e1e0 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e  pt to reload con
1e1f0 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1e200 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72  tabase is requir
1e210 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a  ed and fails, .*
1e220 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  * return an SQLi
1e230 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  te error code. O
1e240 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1e250 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
1e260 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c  nt pagerUndoCall
1e270 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c  back(void *pCtx,
1e280 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e   Pgno iPg){.  in
1e290 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e2a0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1e2b0 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74  r = (Pager *)pCt
1e2c0 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  x;.  PgHdr *pPg;
1e2d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1e2e0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1e2f0 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74  );.  pPg = sqlit
1e300 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
1e310 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66  ager, iPg);.  if
1e320 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28  ( pPg ){.    if(
1e330 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
1e340 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d  geRefcount(pPg)=
1e350 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
1e360 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
1e370 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
1e380 20 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20       u32 iFrame 
1e390 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1e3a0 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
1e3b0 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
1e3c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46  , pPg->pgno, &iF
1e3d0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  rame);.      if(
1e3e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e3f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
1e400 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69  eadDbPage(pPg, i
1e410 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Frame);.      }.
1e420 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1e430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e440 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
1e450 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20  iter(pPg);.     
1e460 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1e470 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
1e480 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  l(pPg);.    }.  
1e490 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79  }..  /* Normally
1e4a0 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  , if a transacti
1e4b0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1e4c0 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72  k, any backup pr
1e4d0 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a  ocesses are.  **
1e4e0 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61   updated as data
1e4f0 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f   is copied out o
1e500 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1e510 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20  ournal and into 
1e520 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
1e530 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67  e. This is not g
1e540 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c  enerally possibl
1e550 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74  e with a WAL dat
1e560 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72  abase, as.  ** r
1e570 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73  ollback involves
1e580 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69   simply truncati
1e590 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  ng the log file.
1e5a0 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f   Therefore, if o
1e5b0 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20  ne.  ** or more 
1e5c0 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65  frames have alre
1e5d0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1e5e0 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64   to the log (and
1e5f0 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a   therefore .  **
1e600 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74   also copied int
1e610 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74  o the backup dat
1e620 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20  abases) as part 
1e630 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
1e640 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61  ion,.  ** the ba
1e650 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65  ckups must be re
1e660 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  started..  */.  
1e670 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
1e680 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
1e690 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ckup);..  return
1e6a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1e6b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1e6c0 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
1e6d0 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
1e6e0 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  on a WAL databas
1e6f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e700 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
1e710 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1e720 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
1e750 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  de */.  PgHdr *p
1e760 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1e770 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1e780 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74  of dirty pages t
1e790 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f  o revert */..  /
1e7a0 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  * For all pages 
1e7b0 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
1e7c0 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
1e7d0 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c  dirty or have al
1e7e0 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20  ready.  ** been 
1e7f0 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74  written (but not
1e800 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74   committed) to t
1e810 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20  he log file, do 
1e820 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  one of the .  **
1e830 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a   following:.  **
1e840 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72  .  **   + Discar
1e850 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67  d the cached pag
1e860 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d  e (if refcount==
1e870 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20  0), or.  **   + 
1e880 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  Reload page cont
1e890 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1e8a0 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75  abase (if refcou
1e8b0 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50  nt>0)..  */.  pP
1e8c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1e8d0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1e8e0 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1e8f0 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d  3WalUndo(pPager-
1e900 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f  >pWal, pagerUndo
1e910 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
1e920 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69  *)pPager);.  pLi
1e930 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1e940 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1e950 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1e960 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20  while( pList && 
1e970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e980 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78  .    PgHdr *pNex
1e990 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1e9a0 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  y;.    rc = page
1e9b0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76  rUndoCallback((v
1e9c0 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c  oid *)pPager, pL
1e9d0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
1e9e0 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pList = pNext;. 
1e9f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1ea00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1ea10 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
1ea20 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
1ea30 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20  te3WalFrames(). 
1ea40 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69  As well as loggi
1ea50 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ng.** the conten
1ea60 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f  ts of the list o
1ea70 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62  f pages headed b
1ea80 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74  y pList (connect
1ea90 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a  ed by pDirty),.*
1eaa0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1eab0 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74  notifies any act
1eac0 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ive backup proce
1ead0 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61  sses that the pa
1eae0 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e  ges have.** chan
1eaf0 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ged. .**.** The 
1eb00 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61  list of pages pa
1eb10 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
1eb20 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73  outine is always
1eb30 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20   sorted by page 
1eb40 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65  number..** Hence
1eb50 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65  , if page 1 appe
1eb60 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  ars anywhere on 
1eb70 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c  the list, it wil
1eb80 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70  l be the first p
1eb90 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  age..*/ .static 
1eba0 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d  int pagerWalFram
1ebb0 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  es(.  Pager *pPa
1ebc0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
1ebd0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1ebe0 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72  bject */.  PgHdr
1ebf0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
1ec00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1ec10 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
1ec20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54  log */.  Pgno nT
1ec30 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
1ec40 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1ec50 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20  base size after 
1ec60 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  this commit */. 
1ec70 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1eca0 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a   is a commit */.
1ecb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1ece0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69  ode */.  int nLi
1ecf0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1ed00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ed10 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
1ed20 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  List */.  PgHdr 
1ed30 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1ed40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1ed50 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61   looping over pa
1ed60 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ges */..  assert
1ed70 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29  ( pPager->pWal )
1ed80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
1ed90 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  t );.#ifdef SQLI
1eda0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
1edb0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61  rify that the pa
1edc0 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63  ge list is in ac
1edd0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
1ede0 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1edf0 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20  p && p->pDirty; 
1ee00 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1ee10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e    assert( p->pgn
1ee20 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70  o < p->pDirty->p
1ee30 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  gno );.  }.#endi
1ee40 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  f..  assert( pLi
1ee50 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c  st->pDirty==0 ||
1ee60 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69   isCommit );.  i
1ee70 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  f( isCommit ){. 
1ee80 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74     /* If a WAL t
1ee90 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
1eea0 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  ing committed, t
1eeb0 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1eec0 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20   in writing.    
1eed0 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74  ** any pages wit
1eee0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1eef0 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75  reater than nTru
1ef00 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57  ncate into the W
1ef10 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  AL file..    ** 
1ef20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  They will never 
1ef30 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63  be read by any c
1ef40 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65  lient. So remove
1ef50 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70   them from the p
1ef60 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73  Dirty.    ** lis
1ef70 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50  t here. */.    P
1ef80 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20  gHdr **ppNext = 
1ef90 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73  &pList;.    nLis
1efa0 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  t = 0;.    for(p
1efb0 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74  =pList; (*ppNext
1efc0 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70   = p)!=0; p=p->p
1efd0 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66  Dirty){.      if
1efe0 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e  ( p->pgno<=nTrun
1eff0 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  cate ){.        
1f000 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69  ppNext = &p->pDi
1f010 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69  rty;.        nLi
1f020 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st++;.      }.  
1f030 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1f040 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  pList );.  }else
1f050 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b  {.    nList = 1;
1f060 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61  .  }.  pPager->a
1f070 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
1f080 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b  WRITE] += nList;
1f090 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70  ..  if( pList->p
1f0a0 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
1f0b0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1f0c0 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20  er(pList);.  rc 
1f0d0 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  = sqlite3WalFram
1f0e0 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  es(pPager->pWal,
1f0f0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
1f100 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c  pageSize, pList,
1f110 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f   nTruncate, isCo
1f120 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61  mmit, pPager->wa
1f130 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a  lSyncFlags.  );.
1f140 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f150 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70  _OK && pPager->p
1f160 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f  Backup ){.    fo
1f170 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1f180 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1f190 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1f1a0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1f1b0 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
1f1c0 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
1f1d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1f1e0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1f1f0 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20  PAGES.  pList = 
1f200 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1f210 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1f220 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70  PCache);.  for(p
1f230 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1f240 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67  pDirty){.    pag
1f250 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
1f260 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
1f270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f280 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65  /*.** Begin a re
1f290 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad transaction o
1f2a0 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a  n the WAL..**.**
1f2b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1f2c0 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1f2d0 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68  "pagerOpenSnapsh
1f2e0 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74  ot()" because it
1f2f0 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20   essentially.** 
1f300 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74  makes a snapshot
1f310 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f320 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
1f330 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e  point in time an
1f340 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74  d preserves.** t
1f350 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72  hat snapshot for
1f360 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64   use by the read
1f370 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63  er in spite of c
1f380 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e  oncurrently chan
1f390 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20  ges by.** other 
1f3a0 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b  writers or check
1f3b0 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
1f3c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67  tic int pagerBeg
1f3d0 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1f3e0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
1f3f0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1f420 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e  de */.  int chan
1f430 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ged = 0;        
1f440 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1f450 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  if cache must be
1f460 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73   reset */..  ass
1f470 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1f480 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
1f490 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1f4a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1f4b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1f4c0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
1f4d0 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65   );..  /* sqlite
1f4e0 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1f4f0 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74  action() was not
1f500 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
1f510 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72  previous.  ** tr
1f520 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63  ansaction in loc
1f530 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
1f540 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74  IVE.  So call it
1f550 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a   now.  If we.  *
1f560 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67  * are in locking
1f570 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64  _mode=NORMAL and
1f580 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70   EndRead() was p
1f590 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
1f5a0 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69  ,.  ** the dupli
1f5b0 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72  cate call is har
1f5c0 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  mless..  */.  sq
1f5d0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1f5e0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1f5f0 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20  r->pWal);..  rc 
1f600 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
1f610 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1f620 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
1f630 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20  changed);.  if( 
1f640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1f650 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
1f660 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1f670 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45  er);.    if( USE
1f680 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20  FETCH(pPager) ) 
1f690 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
1f6a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
1f6b0 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
1f6c0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
1f6d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f6e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
1f6f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61   part of the tra
1f700 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47  nsition from PAG
1f710 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41  ER_OPEN.** to PA
1f720 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65  GER_READER state
1f730 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1f740 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1f750 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
1f760 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e  n pages (assumin
1f770 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  g the page size 
1f780 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1f790 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69   in Pager.pageSi
1f7a0 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ze)..**.** If no
1f7b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
1f7c0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1f7d0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a  rned and the siz
1f7e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1f7f0 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73  e.** in pages is
1f800 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61   stored in *pnPa
1f810 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ge. Otherwise, a
1f820 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65  n error code (pe
1f830 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  rhaps.** SQLITE_
1f840 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20  IOERR_FSTAT) is 
1f850 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e  returned and *pn
1f860 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d  Page is left unm
1f870 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74  odified..*/.stat
1f880 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65  ic int pagerPage
1f890 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
1f8a0 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67  ger, Pgno *pnPag
1f8b0 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  e){.  Pgno nPage
1f8c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f8d0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
1f8e0 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e  o return via *pn
1f8f0 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75  Page */..  /* Qu
1f900 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d  ery the WAL sub-
1f910 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64  system for the d
1f920 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68  atabase size. Th
1f930 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20  e WalDbsize().  
1f940 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
1f950 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20  rns zero if the 
1f960 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  WAL is not open 
1f970 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c  (i.e. Pager.pWal
1f980 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66  ==0), or.  ** if
1f990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1f9a0 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  ze is not availa
1f9b0 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73  ble. The databas
1f9c0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20  e size is not.  
1f9d0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ** available fro
1f9e0 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
1f9f0 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20  stem if the log 
1fa00 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72  file is empty or
1fa10 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e  .  ** contains n
1fa20 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65  o valid committe
1fa30 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  d transactions..
1fa40 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1fa50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1fa60 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
1fa70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1fa80 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
1fa90 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
1faa0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1fab0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1fac0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
1fad0 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  =0 );.  nPage = 
1fae0 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
1faf0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1fb00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d  .  /* If the num
1fb10 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1fb20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1fb30 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72  not available fr
1fb40 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20  om the.  ** WAL 
1fb50 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65  sub-system, dete
1fb60 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65 20 63  rmine the page c
1fb70 6f 75 6e 74 65 20 62 61 73 65 64 20 6f 6e 20 74  ounte based on t
1fb80 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20  he size of.  ** 
1fb90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fba0 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65 20  e.  If the size 
1fbb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1fbc0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20  file is not an. 
1fbd0 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   ** integer mult
1fbe0 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65  iple of the page
1fbf0 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20  -size, round up 
1fc00 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
1fc10 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
1fc20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70 65 6e  && ALWAYS(isOpen
1fc30 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b  (pPager->fd)) ){
1fc40 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
1fc70 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1fc80 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
1fc90 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1fca0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
1fcb0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1fcc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fcd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fce0 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50  }.    nPage = (P
1fcf0 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e  gno)((n+pPager->
1fd00 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50  pageSize-1) / pP
1fd10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1fd20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1fd30 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  e current number
1fd40 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1fd50 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72   file is greater
1fd60 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63   than the.  ** c
1fd70 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75  onfigured maximu
1fd80 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20  m pager number, 
1fd90 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  increase the all
1fda0 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20  owed limit so.  
1fdb0 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  ** that the file
1fdc0 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20   can be read..  
1fdd0 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70  */.  if( nPage>p
1fde0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
1fdf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
1fe00 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67  gno = (Pgno)nPag
1fe10 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67  e;.  }..  *pnPag
1fe20 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
1fe30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1fe40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fe50 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
1fe60 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77  Check if the *-w
1fe70 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72  al file that cor
1fe80 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
1fe90 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
1fea0 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69  by pPager.** exi
1feb0 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62  sts if the datab
1fec0 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c  ase is not empy,
1fed0 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20   or verify that 
1fee0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64  the *-wal file d
1fef0 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74  oes.** not exist
1ff00 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74   (by deleting it
1ff10 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  ) if the databas
1ff20 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e  e file is empty.
1ff30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
1ff40 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d  tabase is not em
1ff50 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61  pty and the *-wa
1ff60 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f  l file exists, o
1ff70 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  pen the pager.**
1ff80 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49   in WAL mode.  I
1ff90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1ffa0 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f  s empty or if no
1ffb0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
1ffc0 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20  ts and.** if no 
1ffd0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61  error occurs, ma
1ffe0 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f  ke sure Pager.jo
1fff0 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74  urnalMode is not
20000 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52   set to.** PAGER
20010 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
20020 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
20030 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65  QLITE_OK or an e
20040 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
20050 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
20060 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c   hold a SHARED l
20070 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20080 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c  ase file to call
20090 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
200a0 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58  n. Because an EX
200b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
200c0 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72  the db file is r
200d0 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74  equired to delet
200e0 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61  e .** a WAL on a
200f0 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61   none-empty data
20100 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72  base, this ensur
20110 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72  es there is no r
20120 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a  ace condition .*
20130 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41  * between the xA
20140 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e  ccess() below an
20150 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62  d an xDelete() b
20160 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79  eing executed by
20170 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20   some .** other 
20180 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
20190 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
201a0 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
201b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
201c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
201d0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
201e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
201f0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
20200 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20210 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
20220 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  CK );..  if( !pP
20230 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
20240 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b  {.    int isWal;
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20260 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57      /* True if W
20270 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  AL file exists *
20280 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  /.    Pgno nPage
20290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
202a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
202b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
202c0 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   */..    rc = pa
202d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
202e0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
202f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20300 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50  n rc;.    if( nP
20310 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
20320 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
20330 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
20340 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
20350 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
20360 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
20370 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72  DELETE_NOENT ) r
20380 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
20390 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a       isWal = 0;.
203a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
203b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
203c0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
203d0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70   pPager->pVfs, p
203e0 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c  Pager->zWal, SQL
203f0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
20400 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20  S, &isWal.      
20410 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20430 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61  {.      if( isWa
20440 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  l ){.        tes
20450 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63  tcase( sqlite3Pc
20460 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
20470 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
20480 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
20490 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
204a0 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
204b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
204c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
204d0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
204e0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
204f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20500 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
20510 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20520 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
20530 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20540 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
20550 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
20560 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
20570 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
20580 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
20590 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
205a0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
205b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
205c0 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
205d0 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
205e0 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
205f0 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
20600 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
20610 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
20620 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
20630 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
20640 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
20650 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
20660 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
20670 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
20680 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
20690 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
206a0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
206b0 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
206c0 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
206d0 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
206e0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
206f0 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
20700 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
20710 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20720 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
20730 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
20740 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
20750 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
20760 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
20770 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
20780 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
20790 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
207a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
207b0 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
207c0 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
207d0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
207e0 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
207f0 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
20800 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
20810 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
20820 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
20830 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
20840 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
20850 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
20860 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
20870 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
20880 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
20890 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
208a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
208b0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
208c0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
208d0 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
208e0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
208f0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
20900 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
20910 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
20920 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
20930 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20940 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
20950 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
20960 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
20970 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
20980 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
20990 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
209a0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
209b0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
209c0 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
209d0 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
209e0 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
209f0 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
20a00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
20a10 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
20a20 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
20a30 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
20a40 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
20a50 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
20a60 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
20a70 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
20a80 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
20a90 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
20aa0 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
20ab0 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
20ac0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
20ad0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
20ae0 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
20af0 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
20b00 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
20b10 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
20b20 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
20b30 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
20b40 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
20b50 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
20b60 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
20b70 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
20b80 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
20b90 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
20ba0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
20bb0 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
20bc0 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
20bd0 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
20be0 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
20bf0 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
20c00 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
20c10 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
20c20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20c30 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
20c40 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
20c50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
20c60 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
20c70 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20c90 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
20ca0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20cb0 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
20cc0 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
20cd0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
20ce0 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
20cf0 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
20d00 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
20d10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
20d20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
20d30 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
20d40 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
20d50 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
20d60 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
20d70 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
20d80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20d90 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
20da0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
20db0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
20dc0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
20dd0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
20de0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
20df0 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
20e00 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
20e10 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
20e20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
20e30 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
20e40 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
20e50 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
20e60 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
20e70 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
20e80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20e90 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
20ea0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
20eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
20ec0 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
20ed0 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
20ee0 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
20ef0 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
20f00 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
20f10 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
20f20 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
20f30 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
20f40 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
20f50 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
20f60 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
20f70 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
20f80 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
20f90 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
20fa0 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
20fb0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
20fc0 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
20fd0 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
20fe0 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
20ff0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21000 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
21010 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
21020 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
21030 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
21040 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
21050 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
21060 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
21070 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
21080 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
21090 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
210a0 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
210b0 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
210c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
210d0 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
210e0 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
210f0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
21100 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
21110 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21120 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
21130 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
21140 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
21150 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
21160 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
21170 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
21180 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
21190 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
211a0 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
211b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
211c0 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
211d0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
211e0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
211f0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
21200 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
21210 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
21220 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
21230 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
21240 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
21250 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
21260 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
21270 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
21280 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
21290 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
212a0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
212b0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
212c0 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
212d0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
212e0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
212f0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
21300 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
21310 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
21320 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
21330 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
21340 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
21350 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
21360 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
21370 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
21380 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
21390 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
213a0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
213b0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
213c0 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
213d0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
213e0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
213f0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
21400 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
21410 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
21420 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
21430 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
21440 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
21450 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21460 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
21470 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
21480 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
21490 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
214a0 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
214b0 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
214c0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
214d0 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
214e0 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
214f0 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
21500 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
21510 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
21520 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
21530 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
21540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21550 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21560 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
21570 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
21580 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21590 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
215a0 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
215b0 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
215c0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
215d0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
215e0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
215f0 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
21600 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
21610 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
21620 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
21630 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
21640 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
21650 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
21660 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
21670 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
21680 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
21690 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
216a0 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
216b0 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
216c0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
216d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
216e0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
216f0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
21700 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
21710 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
21720 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
21730 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
21740 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
21750 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
21760 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
21770 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
21780 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
21790 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
217a0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
217b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
217c0 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
217d0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
217e0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
217f0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
21800 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
21810 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21820 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
21830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21840 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
21850 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21860 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21870 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
21880 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
21890 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
218a0 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
218b0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
218c0 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
218d0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
218e0 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
218f0 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
21900 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
21910 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
21920 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
21930 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
21940 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
21950 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
21960 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
21970 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
21980 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
21990 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
219a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
219b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
219c0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
219d0 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
219e0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
219f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
21a00 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
21a10 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21a20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21a30 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
21a40 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
21a50 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
21a60 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
21a70 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
21a80 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
21a90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
21aa0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
21ab0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
21ac0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
21ad0 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
21ae0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
21af0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21b00 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
21b10 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
21b20 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
21b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21b40 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21b50 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
21b60 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
21b70 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
21b80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21b90 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
21ba0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
21bb0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
21bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
21bd0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
21be0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
21bf0 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
21c00 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f   allowed.** befo
21c10 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
21c20 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61   recycle clean a
21c30 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e  nd unused pages.
21c40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21c50 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
21c60 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
21c70 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
21c80 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
21c90 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
21ca0 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
21cb0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  e);.}../*.** Cha
21cc0 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
21cd0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
21ce0 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
21cf0 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
21d00 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
21d10 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74  to spill pages t
21d20 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  o journal..*/.in
21d30 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
21d40 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72  tSpillsize(Pager
21d50 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
21d60 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
21d70 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
21d80 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72  Spillsize(pPager
21d90 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
21da0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  e);.}../*.** Inv
21db0 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  oke SQLITE_FCNTL
21dc0 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64  _MMAP_SIZE based
21dd0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
21de0 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e  value of szMmap.
21df0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21e00 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
21e10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21e20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
21e30 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71  MMAP_SIZE>0.  sq
21e40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
21e50 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69   pPager->fd;.  i
21e60 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26  f( isOpen(fd) &&
21e70 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69   fd->pMethods->i
21e80 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20  Version>=3 ){.  
21e90 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
21ea0 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61  sz;.    sz = pPa
21eb0 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20  ger->szMmap;.   
21ec0 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74   pPager->bUseFet
21ed0 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20  ch = (sz>0);.   
21ee0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
21ef0 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
21f00 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
21f10 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73  TL_MMAP_SIZE, &s
21f20 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  z);.  }.#endif.}
21f30 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
21f40 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
21f50 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61  of any memory ma
21f60 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68  pping made of th
21f70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21f80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21f90 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
21fa0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
21fb0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
21fc0 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72  zMmap){.  pPager
21fd0 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61  ->szMmap = szMma
21fe0 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70  p;.  pagerFixMap
21ff0 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d  limit(pPager);.}
22000 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20  ../*.** Free as 
22010 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
22020 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65  ossible from the
22030 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20   pager..*/.void 
22040 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69  sqlite3PagerShri
22050 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nk(Pager *pPager
22060 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
22070 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d  heShrink(pPager-
22080 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
22090 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69  .** Adjust setti
220a0 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  ngs of the pager
220b0 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
220c0 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61  ied in the pgFla
220d0 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  gs parameter..**
220e0 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20  .** The "level" 
220f0 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  in pgFlags & PAG
22100 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
22110 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62  ASK sets the rob
22120 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68  ustness.** of th
22130 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
22140 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
22150 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20  rashes or power 
22160 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63  failures by.** c
22170 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
22180 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
22190 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  hen writing the 
221a0 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65  journals..** The
221b0 72 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65  re are four leve
221c0 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
221d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
221e0 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
221f0 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
22200 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
22220 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
22230 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
22240 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
22250 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
22260 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
22270 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
22280 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
22290 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
222a0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
222b0 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
222c0 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
222e0 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
222f0 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
22300 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
22310 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
22320 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
22330 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
22340 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
22350 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
22360 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
22370 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
22380 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
22390 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
223a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
223b0 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
223c0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
223d0 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
223e0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
223f0 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
22400 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
22410 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22420 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
22430 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
22440 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
22450 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
22460 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
22470 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
22480 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
22490 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
224a0 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
224b0 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
224c0 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
224d0 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
224e0 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
224f0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
22500 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
22510 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
22520 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22530 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
22540 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
22550 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
22560 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
22570 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
22580 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
22590 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
225a0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
225b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41  ..**.**    EXTRA
225c0 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b       This is lik
225d0 65 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68  e FULL except th
225e0 61 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73  at is also syncs
225f0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
22600 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
22610 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
22620 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
22630 6c 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c  l after the roll
22640 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20  back.**         
22650 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20       journal is 
22660 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20  unlinked..**.** 
22670 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72  The above is for
22680 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72   a rollback-jour
22690 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57  nal mode.  For W
226a0 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e  AL mode, OFF con
226b0 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61  tinues.** to mea
226c0 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20  n that no syncs 
226d0 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52  ever occur.  NOR
226e0 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  MAL means that t
226f0 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64  he WAL is synced
22700 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65  .** prior to the
22710 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70   start of checkp
22720 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68  oint and that th
22730 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22740 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20  is synced.** at 
22750 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
22760 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  f the checkpoint
22770 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63   if the entire c
22780 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41  ontent of the WA
22790 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e  L.** was written
227a0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
227b0 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f  atabase.  But no
227c0 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73   sync operations
227d0 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e   occur for.** an
227e0 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74   ordinary commit
227f0 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20   in NORMAL mode 
22800 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20  with WAL.  FULL 
22810 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57  means that the W
22820 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79  AL.** file is sy
22830 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  nced following e
22840 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61  ach commit opera
22850 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f  tion, in additio
22860 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63  n to the.** sync
22870 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
22880 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65  h NORMAL.  There
22890 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63   is no differenc
228a0 65 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a  e between FULL.*
228b0 2a 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20  * and EXTRA for 
228c0 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  WAL mode..**.** 
228d0 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73  Do not confuse s
228e0 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
228f0 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43  with SQLITE_SYNC
22900 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53  _FULL.  The.** S
22910 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20  QLITE_SYNC_FULL 
22920 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75  macro means to u
22930 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74  se the MacOSX-st
22940 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a  yle full-fsync.*
22950 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f  * using fcntl(F_
22960 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c  FULLFSYNC).  SQL
22970 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
22980 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a  means to do an.*
22990 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63  * ordinary fsync
229a0 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20  () call.  There 
229b0 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  is no difference
229c0 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f   between SQLITE_
229d0 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64  SYNC_FULL.** and
229e0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
229f0 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73  MAL on platforms
22a00 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f   other than MacO
22a10 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20  SX.  But the.** 
22a20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
22a30 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e   versus synchron
22a40 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69  ous=NORMAL setti
22a50 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ng determines wh
22a60 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20  en.** the xSync 
22a70 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c  primitive is cal
22a80 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76  led and is relev
22a90 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66  ant to all platf
22aa0 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  orms..**.** Nume
22ab0 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
22ac0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
22ad0 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
22ae0 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
22af0 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
22b00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22b10 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
22b20 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
22b30 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50  gerSetFlags(.  P
22b40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
22b50 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
22b60 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20  r to set safety 
22b70 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75  level for */.  u
22b80 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
22b90 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
22ba0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e  flags */.){.  un
22bb0 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70  signed level = p
22bc0 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53  gFlags & PAGER_S
22bd0 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b  YNCHRONOUS_MASK;
22be0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
22bf0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
22c00 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
22c10 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  1;.    pPager->f
22c20 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  ullSync = 0;.   
22c30 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
22c40 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
22c50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
22c60 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41  ync =  level==PA
22c70 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
22c80 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50  OFF ?1:0;.    pP
22c90 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
22ca0 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59   level>=PAGER_SY
22cb0 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f  NCHRONOUS_FULL ?
22cc0 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1:0;.    pPager-
22cd0 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76  >extraSync = lev
22ce0 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52  el==PAGER_SYNCHR
22cf0 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30  ONOUS_EXTRA ?1:0
22d00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
22d10 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
22d20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22d30 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ags = 0;.    pPa
22d40 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22d50 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  gs = 0;.  }else 
22d60 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
22d70 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b  GER_FULLFSYNC ){
22d80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22d90 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22da0 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70  SYNC_FULL;.    p
22db0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22dc0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22dd0 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
22de0 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
22df0 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53  AGER_CKPT_FULLFS
22e00 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65  YNC ){.    pPage
22e10 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
22e20 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22e30 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
22e40 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
22e50 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
22e60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22e70 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22e80 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22e90 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
22ea0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22eb0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22ec0 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RMAL;.  }.  pPag
22ed0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
22ee0 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46   = pPager->syncF
22ef0 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67  lags;.  if( pPag
22f00 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
22f10 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
22f20 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f  yncFlags |= WAL_
22f30 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
22f40 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46  S;.  }.  if( pgF
22f50 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43  lags & PAGER_CAC
22f60 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70  HESPILL ){.    p
22f70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
22f80 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f  l &= ~SPILLFLAG_
22f90 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OFF;.  }else{.  
22fa0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
22fb0 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
22fc0 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  G_OFF;.  }.}.#en
22fd0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
22fe0 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
22ff0 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
23000 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
23010 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
23020 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
23030 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23040 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
23050 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
23060 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
23070 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
23080 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
23090 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
230a0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
230b0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
230c0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
230d0 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
230e0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
230f0 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
23100 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
23110 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
23120 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
23130 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
23140 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
23150 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
23160 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
23170 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
23180 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
23190 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
231a0 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
231b0 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
231c0 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
231d0 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
231e0 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
231f0 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
23200 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
23210 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
23220 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
23230 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
23240 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
23250 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23260 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
23270 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
23280 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
23290 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
232a0 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
232b0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
232c0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
232d0 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
232e0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
232f0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
23300 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
23310 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
23320 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
23330 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
23340 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
23350 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23370 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
23380 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
23390 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
233a0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
233b0 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
233c0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
233d0 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
233e0 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
233f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23400 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
23410 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
23420 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
23430 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
23440 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
23450 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
23460 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
23470 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
23480 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
23490 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
234a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
234b0 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
234c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
234d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
234e0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
234f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
23500 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
23510 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
23520 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
23530 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
23540 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
23550 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
23560 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
23570 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
23580 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
23590 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
235a0 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
235b0 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
235c0 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
235d0 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
235e0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
235f0 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
23600 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
23610 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
23620 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
23630 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
23640 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
23650 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
23660 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
23670 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
23680 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
23690 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
236a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
236b0 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
236c0 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
236d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
236e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
236f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23700 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
23710 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
23720 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
23730 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
23740 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
23750 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
23760 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
23770 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
23780 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
23790 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
237a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
237b0 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
237c0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
237d0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
237e0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
237f0 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
23800 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
23810 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
23820 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
23830 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
23840 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
23850 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
23860 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
23870 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
23880 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
23890 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
238c0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
238d0 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
238e0 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
238f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
23900 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
23910 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
23920 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
23930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23940 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
23950 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
23960 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  */.){.  pPager->
23970 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
23980 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
23990 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
239a0 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
239b0 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28  ndlerArg;..  if(
239c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
239d0 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
239e0 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29  **ap = (void **)
239f0 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61  &pPager->xBusyHa
23a00 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72  ndler;.    asser
23a10 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64  t( ((int(*)(void
23a20 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42   *))(ap[0]))==xB
23a30 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20  usyHandler );.  
23a40 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d    assert( ap[1]=
23a50 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  =pBusyHandlerArg
23a60 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
23a70 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
23a80 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
23a90 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41  ITE_FCNTL_BUSYHA
23aa0 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61  NDLER, (void *)a
23ab0 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
23ac0 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
23ad0 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
23ae0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
23af0 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
23b00 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
23b10 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
23b20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
23b30 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
23b40 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
23b50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
23b60 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
23b70 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
23b80 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
23b90 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
23ba0 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
23bb0 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
23bc0 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54  _IOERR, an SQLIT
23bd0 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d  E_IOERR_xxx sub-
23be0 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46  code or SQLITE_F
23bf0 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
23c00 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
23c10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
23c20 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
23c30 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
23c40 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
23c50 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
23c60 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
23c70 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
23c80 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
23c90 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
23ca0 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
23cb0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
23cc0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
23cd0 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
23ce0 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
23cf0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
23d00 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
23d10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
23d20 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
23d30 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
23d40 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
23d50 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
23d60 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
23d70 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
23d80 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
23d90 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
23da0 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
23db0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
23dc0 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
23dd0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
23de0 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
23df0 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
23e00 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
23e10 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
23e20 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
23e30 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
23e40 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
23e50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
23e60 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
23e70 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
23e80 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
23e90 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
23ea0 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
23eb0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
23ec0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
23ed0 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
23ee0 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
23ef0 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
23f00 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
23f10 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
23f20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
23f30 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
23f40 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
23f50 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
23f60 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
23f70 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
23f80 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
23f90 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
23fa0 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
23fb0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
23fc0 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
23fd0 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
23fe0 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
23ff0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
24000 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
24010 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69  er, u32 *pPageSi
24020 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
24030 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24040 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
24050 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
24060 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61  e to do a full a
24070 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
24080 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69  e() here, as thi
24090 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
240a0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72  may be called fr
240b0 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f  om within PagerO
240c0 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68  pen(), before th
240d0 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20  e state.  ** of 
240e0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
240f0 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63   is internally c
24100 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a  onsistent..  **.
24110 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    ** At one poin
24120 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
24130 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
24140 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77  r if the pager w
24150 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45  as in .  ** PAGE
24160 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42  R_ERROR state. B
24170 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45  ut since PAGER_E
24180 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61  RROR state guara
24190 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  ntees that.  ** 
241a0 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73  there is at leas
241b0 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
241c0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
241d0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
241e0 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
241f0 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e  for that case an
24200 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33  yhow..  */..  u3
24210 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  2 pageSize = *pP
24220 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
24230 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
24240 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
24250 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
24260 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
24270 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ZE) );.  if( (pP
24280 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
24290 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
242a0 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74  ==0).   && sqlit
242b0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
242c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
242d0 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65  )==0 .   && page
242e0 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
242f0 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  !=(u32)pPager->p
24300 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  ageSize .  ){.  
24310 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e    char *pNew = N
24320 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ULL;            
24330 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61   /* New temp spa
24340 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42  ce */.    i64 nB
24350 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  yte = 0;..    if
24360 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24370 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69  >PAGER_OPEN && i
24380 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
24390 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
243a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
243b0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
243c0 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
243d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
243e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  OK ){.      pNew
243f0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
24400 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
24410 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
24420 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53  ( !pNew ) rc = S
24430 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
24440 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
24450 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24460 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
24470 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
24480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24490 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
244a0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
244b0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
244c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
244d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
244e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
244f0 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
24500 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ace);.      pPag
24510 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
24520 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67  pNew;.      pPag
24530 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67  er->dbSize = (Pg
24540 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53  no)((nByte+pageS
24550 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29  ize-1)/pageSize)
24560 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
24570 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
24580 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
24590 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
245a0 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  eFree(pNew);.   
245b0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65   }.  }..  *pPage
245c0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
245d0 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72  ageSize;.  if( r
245e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
245f0 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65      if( nReserve
24600 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20  <0 ) nReserve = 
24610 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
24620 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
24630 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
24640 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20  serve<1000 );.  
24650 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
24660 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72  ve = (i16)nReser
24670 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
24680 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
24690 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70  .    pagerFixMap
246a0 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  limit(pPager);. 
246b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
246c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
246d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
246e0 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
246f0 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
24700 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
24710 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
24720 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
24730 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
24740 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
24750 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
24760 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
24770 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
24780 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
24790 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
247a0 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
247b0 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
247c0 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
247d0 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
247e0 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
247f0 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
24800 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
24810 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
24820 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
24830 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
24840 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
24850 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
24860 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
24870 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
24880 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
24890 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
248a0 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
248b0 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
248c0 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
248d0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
248e0 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
248f0 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
24900 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
24910 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
24920 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
24930 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
24940 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
24950 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
24960 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
24970 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
24980 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
24990 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
249a0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
249b0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
249c0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
249d0 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
249e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
249f0 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
24a00 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
24a10 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
24a20 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20  ER_OPEN );      
24a30 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62  /* Called only b
24a40 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f  y OP_MaxPgcnt */
24a50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24a60 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65  r->mxPgno>=pPage
24a70 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a  r->dbSize );  /*
24a80 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66   OP_MaxPgcnt enf
24a90 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  orces this */.  
24aa0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
24ab0 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
24ac0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
24ad0 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
24ae0 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
24af0 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
24b00 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
24b10 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
24b20 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
24b30 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
24b40 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
24b50 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
24b60 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
24b70 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
24b80 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
24b90 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
24ba0 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
24bb0 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
24bc0 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
24bd0 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
24be0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
24bf0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
24c00 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
24c10 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
24c20 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
24c30 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
24c40 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
24c50 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
24c60 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
24c70 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
24c80 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24c90 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
24ca0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
24cb0 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
24cc0 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
24cd0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
24ce0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
24cf0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
24d00 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
24d10 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
24d20 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24d30 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
24d40 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
24d50 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
24d60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
24d70 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
24d80 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
24d90 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
24da0 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
24db0 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
24dc0 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
24dd0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
24de0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
24df0 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
24e00 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
24e10 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
24e20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
24e30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
24e40 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
24e50 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
24e60 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
24e70 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
24e80 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
24e90 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
24ea0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
24eb0 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
24ec0 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
24ed0 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
24ee0 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
24ef0 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
24f00 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
24f10 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
24f20 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
24f30 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
24f40 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
24f50 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
24f60 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
24f70 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
24f80 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
24f90 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
24fa0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
24fb0 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
24fc0 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
24fd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24fe0 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
24ff0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
25000 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
25010 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
25020 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25030 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
25040 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
25050 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
25060 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
25070 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
25080 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
25090 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
250a0 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64  d by btree immed
250b0 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65  iately after cre
250c0 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50  ating.  ** the P
250d0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68  ager object.  Th
250e0 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ere has not been
250f0 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
25100 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20  to transition.  
25110 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79  ** to WAL mode y
25120 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
25130 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
25140 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
25150 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
25160 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
25170 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
25180 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
25190 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
251a0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
251b0 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
251c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
251d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
251e0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
251f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25200 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25210 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25220 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25230 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
25240 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74  ed when a read-t
25250 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
25260 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  en on.** the pag
25270 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74  er. It returns t
25280 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
25290 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
252a0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
252b0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
252c0 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
252d0 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
252e0 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
252f0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
25300 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
25310 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76   page file..*/.v
25320 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
25330 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
25340 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
25350 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
25360 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
25370 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
25380 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25390 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
253a0 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
253b0 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   );.  *pnPage = 
253c0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53  (int)pPager->dbS
253d0 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.}.../*.** T
253e0 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
253f0 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b  ock of type lock
25400 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61  type on the data
25410 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a  base file. If.**
25420 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72   a similar or gr
25430 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c  eater lock is al
25440 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73  ready held, this
25450 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
25460 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69  o-op.** (returni
25470 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d  ng SQLITE_OK imm
25480 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ediately)..**.**
25490 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65   Otherwise, atte
254a0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  mpt to obtain th
254b0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c  e lock using sql
254c0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e  ite3OsLock(). In
254d0 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73  voke .** the bus
254e0 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
254f0 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e  e lock is curren
25500 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
25510 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e  e. Repeat .** un
25520 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
25530 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61  lback returns fa
25540 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
25550 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
25560 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
25570 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
25580 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
25590 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
255a0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
255b0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
255c0 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49  n.** the lock. I
255d0 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62  f the lock is ob
255e0 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75  tained successfu
255f0 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67  lly, set the Pag
25600 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72  er.state .** var
25610 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  iable to locktyp
25620 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
25630 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
25640 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
25650 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
25660 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
25670 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
256a0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
256b0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
256c0 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f  s is either a no
256d0 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65  -op (because the
256e0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
256f0 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  is .  ** already
25700 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f   held), or one o
25710 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  f the transition
25720 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d  s that the busy-
25730 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79  handler.  ** may
25740 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69   be invoked duri
25750 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ng, according to
25760 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
25770 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  ve.  ** sqlite3P
25780 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
25790 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
257a0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
257b0 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20  ock>=locktype). 
257c0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
257d0 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
257e0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
257f0 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
25800 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
25810 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
25820 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
25830 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
25840 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20    );..  do {.   
25850 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
25860 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  b(pPager, lockty
25870 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  pe);.  }while( r
25880 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
25890 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
258a0 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
258b0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
258c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
258d0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  }../*.** Functio
258e0 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  n assertTruncate
258f0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
25900 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f  r) checks that o
25910 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f  ne of the .** fo
25920 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
25930 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  for all dirty pa
25940 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
25950 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a   the page-cache:
25960 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20  .**.**   a) The 
25970 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c  page number is l
25980 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
25990 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
259a0 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75   the .**      cu
259b0 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69  rrent database i
259c0 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  mage, in pages, 
259d0 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66  OR.**.**   b) if
259e0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
259f0 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61  t were written a
25a00 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20  t this time, it 
25a10 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20  would not.**    
25a20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74    be necessary t
25a30 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
25a40 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  ent content out 
25a50 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
25a60 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64  al.**      (as d
25a70 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e  etermined by fun
25a80 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72  ction subjRequir
25a90 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  esPage())..**.**
25aa0 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   If the conditio
25ab0 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68  n asserted by th
25ac0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65  is function were
25ad0 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74   not true, and t
25ae0 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
25af0 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63   were to be disc
25b00 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63  arded from the c
25b10 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67  ache via the pag
25b20 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f  erStress().** ro
25b30 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65  utine, pagerStre
25b40 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77  ss() would not w
25b50 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
25b60 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f   page content to
25b70 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
25b80 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65   file. If a save
25b90 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
25ba0 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61  n were rolled ba
25bb0 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73  ck after.** this
25bc0 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63   happened, the c
25bd0 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
25be0 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74  would be to rest
25bf0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ore the current.
25c00 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
25c10 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c  e page. However,
25c20 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74   since this cont
25c30 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ent is not prese
25c40 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  nt in either.** 
25c50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25c60 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e  e or the portion
25c70 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
25c80 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a   journal and .**
25c90 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   sub-journal rol
25ca0 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e  led back the con
25cb0 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  tent could not b
25cc0 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74  e restored and t
25cd0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69  he.** database i
25ce0 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d  mage would becom
25cf0 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73  e corrupt. It is
25d00 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75   therefore fortu
25d10 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68  nate that .** th
25d20 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20  is circumstance 
25d30 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f  cannot arise..*/
25d40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
25d50 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
25d60 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
25d70 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
25d80 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  b(PgHdr *pPg){. 
25d90 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
25da0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
25db0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75  );.  assert( !su
25dc0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
25dd0 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
25de0 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  <=pPg->pPager->d
25df0 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69  bSize );.}.stati
25e00 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
25e10 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25e20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
25e30 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
25e40 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
25e50 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73  er->pPCache, ass
25e60 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25e70 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73  raintCb);.}.#els
25e80 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72  e.# define asser
25e90 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25ea0 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64  int(pPager).#end
25eb0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  if../*.** Trunca
25ec0 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
25ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
25ee0 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61  mage to nPage pa
25ef0 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ges. This .** fu
25f00 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
25f10 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20  actually modify 
25f20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25f30 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a  e on disk. It .*
25f40 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  * just sets the 
25f50 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
25f60 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
25f70 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a  ct so that the .
25f80 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69  ** truncation wi
25f90 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20  ll be done when 
25fa0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
25fb0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
25fc0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tted..**.** This
25fd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
25fe0 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62  y called right b
25ff0 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67  efore committing
26000 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
26010 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e  ** Once this fun
26020 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
26030 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73  alled, the trans
26040 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68  action must eith
26050 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20  er be.** rolled 
26060 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65  back or committe
26070 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  d. It is not saf
26080 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  e to call this f
26090 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74  unction and.** t
260a0 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69  hen continue wri
260b0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
260c0 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
260d0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
260e0 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70  teImage(Pager *p
260f0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
26100 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
26110 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50  ager->dbSize>=nP
26120 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
26130 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
26140 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
26150 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67  CHEMOD );.  pPag
26160 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
26170 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65  ge;..  /* At one
26180 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20   point the code 
26190 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65  here called asse
261a0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
261b0 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65  aint() to.  ** e
261c0 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70  nsure that all p
261d0 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63  ages being trunc
261e0 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69  ated away by thi
261f0 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c  s operation are,
26200 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20  .  ** if one or 
26210 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20  more savepoints 
26220 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e  are open, presen
26230 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69  t in the savepoi
26240 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  nt .  ** journal
26250 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
26260 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66  n be restored if
26270 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69   the savepoint i
26280 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61  s rolled.  ** ba
26290 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c  ck. This is no l
262a0 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20  onger necessary 
262b0 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  as this function
262c0 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a   is now only.  *
262d0 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62  * called right b
262e0 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67  efore committing
262f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
26300 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20  So although the 
26310 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65  .  ** Pager obje
26320 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76  ct may still hav
26330 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  e open savepoint
26340 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  s (Pager.nSavepo
26350 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74  int!=0), .  ** t
26360 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  hey cannot be ro
26370 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68  lled back. So th
26380 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
26390 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c  Constraint() cal
263a0 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e  l.  ** is no lon
263b0 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a  ger correct. */.
263c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
263d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
263e0 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
263f0 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
26400 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a  l rollback. It.*
26410 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  * syncs the jour
26420 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  nal file to disk
26430 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67  , then sets pPag
26440 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  er->journalHdr t
26450 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66  o the.** size of
26460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26470 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  e so that the pa
26480 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
26490 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20  outine knows.** 
264a0 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20  that the entire 
264b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
264c0 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a   been synced..**
264d0 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f  .** Syncing a ho
264e0 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73  t-journal to dis
264f0 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  k before attempt
26500 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ing to roll it b
26510 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20  ack ensures .** 
26520 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d  that if a power-
26530 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64  failure occurs d
26540 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
26550 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20  ck, the process 
26560 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73  that.** attempts
26570 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
26580 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76  ing system recov
26590 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d  ery sees the sam
265a0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e  e journal.** con
265b0 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f  tent as this pro
265c0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  cess..**.** If e
265d0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
265e0 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54  s planned, SQLIT
265f0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26600 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
26610 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
26620 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
26630 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f   int pagerSyncHo
26640 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
26650 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
26660 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26670 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
26680 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
26690 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
266a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
266b0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
266c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
266d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
266e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
266f0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
26700 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  fd, &pPager->jou
26710 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20  rnalHdr);.  }.  
26720 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26730 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66  .** Obtain a ref
26740 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f  erence to a memo
26750 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f  ry mapped page o
26760 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e  bject for page n
26770 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20  umber pgno. .** 
26780 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
26790 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e  ill use the poin
267a0 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69  ter pData, obtai
267b0 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28  ned from xFetch(
267c0 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  )..** If success
267d0 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65  ful, set *ppPage
267e0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
267f0 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72 65   new page refere
26800 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  nce.** and retur
26810 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  n SQLITE_OK. Oth
26820 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
26830 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
26840 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a  ode and set.** *
26850 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a  ppPage to zero..
26860 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72  **.** Page refer
26870 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62  ences obtained b
26880 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  y calling this f
26890 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
268a0 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79  e released.** by
268b0 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65   calling pagerRe
268c0 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a  leaseMapPage()..
268d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
268e0 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
268f0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
26900 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
26910 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
26920 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ject */.  Pgno p
26930 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
26940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
26950 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f  e number */.  vo
26960 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  id *pData,      
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26980 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74 61   xFetch()'d data
26990 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
269a0 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61  /.  PgHdr **ppPa
269b0 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ge              
269c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75      /* OUT: Acqu
269d0 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  ired page object
269e0 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a   */.){.  PgHdr *
269f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
26a00 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
26a10 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 74  ry mapped page t
26a20 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20  o return */.  . 
26a30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d   if( pPager->pMm
26a40 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20  apFreelist ){.  
26a50 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20    *ppPage = p = 
26a60 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
26a70 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65  elist;.    pPage
26a80 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
26a90 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
26aa0 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
26ab0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70  .    memset(p->p
26ac0 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72  Extra, 0, pPager
26ad0 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c  ->nExtra);.  }el
26ae0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
26af0 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73  = p = (PgHdr *)s
26b00 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
26b10 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b  (sizeof(PgHdr) +
26b20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
26b30 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
26b40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
26b50 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
26b60 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d  >fd, (i64)(pgno-
26b70 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67  1) * pPager->pag
26b80 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20  eSize, pData);. 
26b90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26ba0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
26bb0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74     }.    p->pExt
26bc0 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b  ra = (void *)&p[
26bd0 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  1];.    p->flags
26be0 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20   = PGHDR_MMAP;. 
26bf0 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
26c00 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20      p->pPager = 
26c10 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61  pPager;.  }..  a
26c20 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61  ssert( p->pExtra
26c30 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20  ==(void *)&p[1] 
26c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
26c50 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73  pPage==0 );.  as
26c60 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d  sert( p->flags==
26c70 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20  PGHDR_MMAP );.  
26c80 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65  assert( p->pPage
26c90 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
26ca0 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d  ssert( p->nRef==
26cb0 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20  1 );..  p->pgno 
26cc0 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61  = pgno;.  p->pDa
26cd0 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50  ta = pData;.  pP
26ce0 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b  ager->nMmapOut++
26cf0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
26d00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26d10 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
26d20 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e  nce to page pPg.
26d30 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20 62   pPg must have b
26d40 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  een returned by 
26d50 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63  an .** earlier c
26d60 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75  all to pagerAcqu
26d70 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  ireMapPage()..*/
26d80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
26d90 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
26da0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
26db0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
26dc0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70  pPg->pPager;.  p
26dd0 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d  Pager->nMmapOut-
26de0 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  -;.  pPg->pDirty
26df0 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
26e00 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67  Freelist;.  pPag
26e10 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
26e20 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65  t = pPg;..  asse
26e30 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  rt( pPager->fd->
26e40 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
26e50 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74  on>=3 );.  sqlit
26e60 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
26e70 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50  er->fd, (i64)(pP
26e80 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  g->pgno-1)*pPage
26e90 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67  r->pageSize, pPg
26ea0 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pData);.}../*.
26eb0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64  ** Free all PgHd
26ec0 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64  r objects stored
26ed0 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d   in the Pager.pM
26ee0 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74  mapFreelist list
26ef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26f00 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72   pagerFreeMapHdr
26f10 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
26f20 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
26f30 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20  PgHdr *pNext;.  
26f40 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d  for(p=pPager->pM
26f50 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20  mapFreelist; p; 
26f60 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
26f70 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ext = p->pDirty;
26f80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
26f90 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  e(p);.  }.}.../*
26fa0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
26fb0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
26fc0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
26fd0 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
26fe0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
26ff0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
27000 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
27010 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
27020 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
27030 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
27040 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
27050 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
27060 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
27070 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
27080 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
27090 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
270a0 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
270b0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
270c0 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
270d0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
270e0 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
270f0 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
27100 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
27110 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27120 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
27130 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
27140 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
27150 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
27160 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
27170 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
27180 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
27190 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
271a0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
271b0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
271c0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
271d0 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
271e0 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
271f0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
27200 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
27210 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
27220 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75  .  u8 *pTmp = (u
27230 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
27240 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74  Space;..  assert
27250 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
27260 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
27270 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
27280 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
27290 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
272a0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
272b0 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72   pagerFreeMapHdr
272c0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20  s(pPager);.  /* 
272d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
272e0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
272f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
27300 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
27310 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73  ITE_OMIT_WAL.  s
27320 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
27330 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61  Pager->pWal, pPa
27340 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
27350 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  gs, pPager->page
27360 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70  Size, pTmp);.  p
27370 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b  Pager->pWal = 0;
27380 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
27390 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
273a0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
273b0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
273c0 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
273d0 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
273e0 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
273f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
27400 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
27410 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
27420 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
27430 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
27440 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
27450 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
27460 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
27470 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
27480 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
27490 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
274a0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
274b0 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
274c0 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
274d0 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
274e0 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
274f0 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
27500 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
27510 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
27520 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
27530 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
27540 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
27550 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
27560 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
27570 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
27580 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
27590 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
275a0 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
275b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
275c0 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
275d0 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
275e0 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
275f0 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
27600 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
27610 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
27620 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
27630 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
27640 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
27650 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27660 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27670 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27680 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  fd) ){.      pag
27690 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
276a0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
276b0 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20  rnal(pPager));. 
276c0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
276d0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
276e0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
276f0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
27700 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
27710 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
27720 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
27730 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
27740 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
27750 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
27760 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
27770 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
27780 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
27790 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74  r->jfd);.  sqlit
277a0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
277b0 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
277c0 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
277d0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
277e0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
277f0 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
27800 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
27810 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
27820 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
27830 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
27840 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
27850 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
27860 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
27870 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
27880 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
27890 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
278a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
278b0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
278c0 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
278d0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
278e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
278f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
27900 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
27910 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
27920 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
27930 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
27940 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
27950 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
27960 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
27970 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
27980 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
27990 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
279a0 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
279b0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
279c0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
279d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
279e0 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
279f0 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
27a00 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
27a10 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
27a20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
27a30 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
27a40 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
27a50 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
27a60 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
27a70 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
27a80 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
27a90 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
27aa0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
27ab0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
27ac0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
27ad0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
27ae0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
27af0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
27b00 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
27b10 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27b20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
27b30 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
27b40 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
27b50 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
27b60 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74  urnal-mode and t
27b70 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68  he .** device ch
27b80 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
27b90 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
27ba0 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
27bb0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a  .**   * If the j
27bc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
27bd0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
27be0 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74  nal file, no act
27bf0 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  ion need.**     
27c00 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20  be taken..**.** 
27c10 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69    * Otherwise, i
27c20 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
27c30 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
27c40 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  e SAFE_APPEND pr
27c50 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74  operty,.**     t
27c60 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
27c70 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ld of the most r
27c80 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20  ecently written 
27c90 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
27ca0 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64  *     is updated
27cb0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
27cc0 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61  number of journa
27cd0 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68  l records that h
27ce0 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20  ave.**     been 
27cf0 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e  written followin
27d00 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67  g it. If the pag
27d10 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20  er is operating 
27d20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20  in full-sync.** 
27d30 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74      mode, then t
27d40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27d50 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65  is synced before
27d60 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75   this field is u
27d70 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
27d80 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20  * If the device 
27d90 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
27da0 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20   the SEQUENTIAL 
27db0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a  property, then .
27dc0 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66  **     journal f
27dd0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ile is synced..*
27de0 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75  *.** Or, in pseu
27df0 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  do-code:.**.**  
27e00 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d   if( NOT <in-mem
27e10 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a  ory journal> ){.
27e20 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
27e30 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a  AFE_APPEND ){.**
27e40 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c         if( <full
27e50 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53  -sync mode> ) xS
27e60 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
27e70 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75  e>);.**       <u
27e80 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64  pdate nRec field
27e90 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20  >.**     } .**  
27ea0 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45     if( NOT SEQUE
27eb0 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a  NTIAL ) xSync(<j
27ec0 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
27ed0 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73  *   }.**.** If s
27ee0 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
27ef0 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
27f00 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
27f10 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79  NC flag of every
27f20 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e   .** page curren
27f30 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  tly held in memo
27f40 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ry before return
27f50 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
27f60 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  f an IO.** error
27f70 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
27f80 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
27f90 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
27fa0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
27fb0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
27fc0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
27fd0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
27fe0 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72  newHdr){.  int r
27ff0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
28010 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
28020 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28030 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
28040 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
28050 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
28060 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
28070 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
28080 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
28090 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
280a0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
280b0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
280c0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20  Pager) );..  rc 
280d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
280e0 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67  clusiveLock(pPag
280f0 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
28100 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28110 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50  n rc;..  if( !pP
28120 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
28130 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
28140 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
28150 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
28160 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
28170 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
28180 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
28190 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
281a0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
281b0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
281c0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
281d0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
281e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
281f0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28200 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
28210 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
28220 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
28230 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
28240 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
28250 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
28260 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
28270 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
28280 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
28290 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
282a0 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
282b0 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
282c0 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
282d0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
282e0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
282f0 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
28300 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
28310 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
28320 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
28330 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
28340 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
28350 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
28360 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
28370 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
28380 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
28390 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
283a0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
283b0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
283c0 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
283d0 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
283e0 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
283f0 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
28400 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
28410 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
28420 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
28430 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
28440 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
28450 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
28460 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28470 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
28480 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
28490 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
284a0 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
284b0 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
284c0 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
284d0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
284e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
284f0 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
28500 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
28510 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
28520 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
28530 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
28540 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
28550 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
28560 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
28570 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
28580 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
28590 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
285a0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
285b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
285c0 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
285d0 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
285e0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
285f0 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
28600 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
28610 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
28620 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
28630 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
28640 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
28650 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
28660 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
28670 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
28680 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
28690 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
286a0 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
286b0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
286c0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
286d0 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
286e0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
286f0 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
28700 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
28710 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
28720 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
28730 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
28740 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
28750 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
28760 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
28770 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
28780 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
28790 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
287a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
287b0 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
287c0 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
287d0 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
287e0 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65   u8 zHeader[size
287f0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
28800 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d  )+4];..        m
28810 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
28820 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
28830 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
28840 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ic));.        pu
28850 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
28860 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
28870 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
28880 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
28890 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
288a0 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
288b0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
288c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
288d0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
288e0 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
288f0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
28900 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
28910 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
28920 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
28930 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
28940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
28950 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
28960 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
28970 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28980 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
28990 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
289a0 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
289b0 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
289c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
289d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
289e0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
289f0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
28a00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28a10 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
28a20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
28a30 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
28a40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28a50 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
28a60 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
28a70 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
28a80 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
28a90 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
28aa0 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
28ab0 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
28ac0 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
28ad0 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
28ae0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
28af0 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
28b00 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
28b10 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
28b20 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28b30 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
28b40 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
28b50 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
28b60 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
28b70 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
28b80 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
28b90 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
28ba0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
28bb0 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
28bc0 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
28bd0 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
28be0 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
28bf0 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
28c00 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
28c10 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
28c20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
28c30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
28c40 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
28c50 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
28c60 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
28c70 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
28c80 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
28c90 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
28ca0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
28cb0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
28cc0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
28cd0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
28ce0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
28cf0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
28d00 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
28d10 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
28d20 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
28d30 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
28d40 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
28d50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28d60 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
28d70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28d80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28d90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28da0 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
28db0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
28dc0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
28dd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
28de0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
28df0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
28e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
28e10 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
28e20 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
28e30 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
28e40 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
28e50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28e60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28e70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28e80 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
28e90 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
28ea0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
28eb0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28ec0 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
28ed0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
28ee0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
28ef0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
28f00 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
28f10 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
28f20 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
28f30 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
28f40 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c  ager->syncFlags|
28f50 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
28f60 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
28f70 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
28f80 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
28f90 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
28fa0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28fb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28fc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28fd0 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72   }..      pPager
28fe0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
28ff0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
29000 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  f;.      if( new
29010 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53  Hdr && 0==(iDc&S
29020 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
29030 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
29040 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
29050 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
29060 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
29070 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
29080 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29090 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
290a0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
290b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
290c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
290d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
290e0 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
290f0 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    /* Unless the 
29100 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79  pager is in noSy
29110 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
29120 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
29130 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  st .  ** success
29140 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69  fully synced. Ei
29150 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20  ther way, clear 
29160 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
29170 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a  YNC flag on .  *
29180 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a  * all pages..  *
29190 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
291a0 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
291b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
291c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  ;.  pPager->eSta
291d0 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
291e0 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72  R_DBMOD;.  asser
291f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
29200 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
29210 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29220 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
29230 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
29240 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
29250 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
29260 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
29270 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
29280 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
29290 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
292a0 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
292b0 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
292c0 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
292d0 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
292e0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
292f0 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
29300 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
29310 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
29320 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
29330 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
29340 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
29350 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
29360 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
29370 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
29380 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
29390 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
293a0 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
293b0 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
293c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
293d0 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
293e0 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
293f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
29400 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
29410 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
29420 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
29430 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
29440 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
29450 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
29460 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
29470 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
29480 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
29490 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
294a0 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
294b0 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
294c0 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
294d0 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
294e0 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
294f0 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
29500 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
29510 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
29520 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
29530 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
29540 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
29550 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
29560 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
29570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
29580 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
29590 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
295a0 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
295b0 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
295c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
295d0 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
295e0 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
295f0 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
29600 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
29610 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
29620 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
29630 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
29640 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
29650 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
29660 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
29670 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
29680 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
29690 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
296a0 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
296b0 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
296c0 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
296d0 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
296e0 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
296f0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
29700 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
29710 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
29720 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
29730 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
29740 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
29750 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
29760 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
29770 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
29780 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
29790 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
297a0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
297b0 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
297c0 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
297d0 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
297e0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
297f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
29800 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
29810 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67  ite_pagelist(Pag
29820 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
29830 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  r *pList){.  int
29840 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29860 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
29870 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
29880 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
29890 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62  called for rollb
298a0 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52  ack pagers in WR
298b0 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65  ITER_DBMOD state
298c0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  . */.  assert( !
298d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
298e0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
298f0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
29900 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  e || pPager->eSt
29910 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
29920 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73  R_DBMOD );.  ass
29930 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
29940 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
29950 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
29960 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
29970 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69  d) || pList->pDi
29980 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
29990 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
299a0 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
299b0 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
299c0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
299d0 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
299e0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
299f0 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
29a00 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
29a10 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
29a20 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
29a30 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
29a40 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
29a50 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
29a60 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
29a70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
29a80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29a90 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
29aa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
29ab0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
29ac0 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
29ad0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
29ae0 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
29af0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68  ..  /* Before th
29b00 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67  e first write, g
29b10 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69  ive the VFS a hi
29b20 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66  nt of what the f
29b30 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73  inal.  ** file s
29b40 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a  ize will be..  *
29b50 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  /.  assert( rc!=
29b60 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
29b70 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
29b80 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
29b90 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50  ITE_OK .   && pP
29ba0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
29bb0 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a  <pPager->dbSize.
29bc0 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44     && (pList->pD
29bd0 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70  irty || pList->p
29be0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69  gno>pPager->dbHi
29bf0 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  ntSize).  ){.   
29c00 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
29c10 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e  zFile = pPager->
29c20 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
29c30 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72  te3_int64)pPager
29c40 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71  ->dbSize;.    sq
29c50 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
29c60 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
29c70 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
29c80 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69  SIZE_HINT, &szFi
29c90 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  le);.    pPager-
29ca0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
29cb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
29cc0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
29cd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
29ce0 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
29cf0 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
29d00 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
29d10 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
29d20 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
29d30 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
29d40 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
29d50 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
29d60 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
29d70 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
29d80 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
29d90 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
29da0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
29db0 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
29dc0 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
29dd0 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
29de0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
29df0 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
29e00 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
29e10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
29e20 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
29e30 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
29e40 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
29e50 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
29e60 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
29e70 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
29e80 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
29e90 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
29ea0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
29eb0 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
29ec0 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
29ed0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
29ee0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
29ef0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
29f00 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
29f10 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
29f20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
29f30 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
29f60 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
29f70 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
29f80 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
29f90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
29fa0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
29fb0 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
29fc0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
29fd0 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
29fe0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f  ;..      /* Enco
29ff0 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
2a000 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
2a010 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
2a020 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
2a030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a040 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b  EM_BKPT, pData);
2a050 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
2a060 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
2a070 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
2a080 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2a090 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
2a0a0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
2a0b0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
2a0c0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
2a0d0 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
2a0e0 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
2a0f0 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
2a100 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
2a110 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
2a120 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
2a130 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
2a140 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
2a150 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
2a160 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a170 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
2a180 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
2a190 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2a1a0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
2a1b0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2a1c0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
2a1d0 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
2a1e0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
2a1f0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
2a200 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
2a210 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
2a220 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
2a230 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2a240 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
2a250 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2a260 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
2a270 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20  _WRITE]++;..    
2a280 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
2a290 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
2a2a0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
2a2b0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
2a2c0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
2a2d0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
2a2e0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
2a2f0 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
2a300 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
2a310 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2a320 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
2a330 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a350 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
2a360 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
2a370 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
2a380 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
2a390 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
2a3a0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
2a3b0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
2a3c0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
2a3d0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
2a3e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a3f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
2a400 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
2a410 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2a420 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
2a430 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
2a440 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  et_pagehash(pLis
2a450 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
2a460 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2a470 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2a480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  .}../*.** Ensure
2a490 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f   that the sub-jo
2a4a0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2a4b0 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  en. If it is alr
2a4c0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  eady open, this 
2a4d0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
2a4e0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
2a4f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2a500 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
2a510 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
2a520 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a  g to plan. An .*
2a530 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  * SQLITE_IOERR_X
2a540 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
2a550 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
2a560 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
2a570 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73  Open() .** fails
2a580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a590 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
2a5a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2a5b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a5c0 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70  _OK;.  if( !isOp
2a5d0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2a5e0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
2a5f0 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54  t flags =  SQLIT
2a600 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2a610 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
2a620 52 45 41 44 57 52 49 54 45 20 0a 20 20 20 20 20  READWRITE .     
2a630 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
2a640 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
2a650 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20  PEN_EXCLUSIVE . 
2a660 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
2a670 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2a680 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53  ;.    int nStmtS
2a690 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f  pill = sqlite3Co
2a6a0 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b  nfig.nStmtSpill;
2a6b0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2a6c0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2a6d0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2a6e0 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
2a6f0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
2a700 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69  {.      nStmtSpi
2a710 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ll = -1;.    }. 
2a720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2a730 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
2a740 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67  r->pVfs, 0, pPag
2a750 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c  er->sjfd, flags,
2a760 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20   nStmtSpill);.  
2a770 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a780 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
2a790 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
2a7a0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
2a7b0 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
2a7c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
2a7d0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2a7e0 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
2a7f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2a800 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
2a810 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
2a820 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
2a830 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
2a840 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
2a850 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2a860 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
2a870 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2a880 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
2a890 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
2a8a0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
2a8b0 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
2a8c0 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
2a8d0 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
2a8e0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
2a8f0 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
2a900 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
2a910 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
2a920 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
2a930 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2a940 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2a950 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a960 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
2a970 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2a980 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2a990 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2a9a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2a9b0 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
2a9c0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
2a9d0 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
2a9e0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
2a9f0 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
2aa00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2aa10 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
2aa20 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2aa30 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
2aa40 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2aa50 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2aa60 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2aa70 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2aa80 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2aa90 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2aaa0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2aab0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2aac0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  InJournal(pPager
2aad0 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  , pPg) .        
2aae0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2aaf0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2ab00 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
2ab10 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2ab20 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
2ab30 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
2ab40 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
2ab50 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
2ab60 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
2ab70 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
2ab80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
2ab90 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
2aba0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
2abb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2abc0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
2abd0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2abe0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2abf0 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
2ac00 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
2ac10 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2ac20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2ac30 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
2ac40 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
2ac50 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
2ac60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2ac70 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29  EM_BKPT, pData2)
2ac80 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
2ac90 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
2aca0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
2acb0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2acc0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2acd0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
2ace0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
2acf0 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
2ad00 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
2ad10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ad20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2ad30 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2ad40 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
2ad50 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
2ad60 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
2ad70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ad80 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2ad90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2ada0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
2adb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2adc0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2add0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
2ade0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
2adf0 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
2ae00 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
2ae10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
2ae20 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
2ae30 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28  lPageIfRequired(
2ae40 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2ae50 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2ae60 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
2ae70 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61  return subjourna
2ae80 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  lPage(pPg);.  }e
2ae90 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2aea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
2aeb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2aec0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2aed0 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
2aee0 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
2aef0 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
2af00 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
2af10 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
2af20 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
2af30 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
2af40 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
2af50 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
2af60 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
2af70 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
2af80 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
2af90 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
2afa0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
2afb0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
2afc0 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
2afd0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
2afe0 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
2aff0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2b000 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
2b010 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
2b020 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2b030 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
2b040 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
2b050 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
2b060 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
2b070 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2b080 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
2b090 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
2b0a0 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
2b0b0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2b0c0 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
2b0d0 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
2b0e0 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
2b0f0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
2b100 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
2b110 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
2b120 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2b130 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
2b140 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
2b150 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2b160 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2b170 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2b180 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
2b190 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
2b1a0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
2b1b0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2b1c0 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
2b1d0 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
2b1e0 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
2b1f0 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
2b200 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
2b210 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
2b220 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
2b230 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
2b240 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
2b250 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
2b260 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
2b270 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
2b280 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
2b290 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
2b2a0 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
2b2b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2b2c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
2b2d0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
2b2e0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
2b2f0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2b300 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f   );..  /* The do
2b310 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20  NotSpill NOSYNC 
2b320 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e  bit is set durin
2b330 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69  g times when doi
2b340 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a  ng a sync of.  *
2b350 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  * journal (and a
2b360 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64  dding a new head
2b370 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  er) is not allow
2b380 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73  ed.  This occurs
2b390 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c  .  ** during cal
2b3a0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2b3b0 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20  erWrite() while 
2b3c0 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61  trying to journa
2b3d0 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20  l multiple.  ** 
2b3e0 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20  pages belonging 
2b3f0 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  to the same sect
2b400 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  or..  **.  ** Th
2b410 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c  e doNotSpill ROL
2b420 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69  LBACK and OFF bi
2b430 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ts inhibits all 
2b440 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20  cache spilling. 
2b450 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f   ** regardless o
2b460 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
2b470 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
2b480 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
2b490 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20  t during.  ** a 
2b4a0 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75  rollback or by u
2b4b0 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73  ser request, res
2b4c0 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a  pectively..  **.
2b4d0 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
2b4e0 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64   also prohibited
2b4f0 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
2b500 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68  r state since th
2b510 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65  at could.  ** le
2b520 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
2b530 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20  orruption.   In 
2b540 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
2b550 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20  ementation it . 
2b560 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   ** is impossibl
2b570 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61  e for sqlite3Pca
2b580 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65  cheFetch() to be
2b590 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65   called with cre
2b5a0 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20  ateFlag==3.  ** 
2b5b0 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72  while in the err
2b5c0 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20  or state, hence 
2b5d0 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
2b5e0 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
2b5f0 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c  e to.  ** be cal
2b600 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72  led in the error
2b610 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68   state.  Neverth
2b620 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64  eless, we includ
2b630 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a  e a NEVER().  **
2b640 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72   test for the er
2b650 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73  ror state as a s
2b660 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74  afeguard against
2b670 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e   future changes.
2b680 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
2b690 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2b6a0 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e) ) return SQLI
2b6b0 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73  TE_OK;.  testcas
2b6c0 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2b6d0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2b6e0 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  G_ROLLBACK );.  
2b6f0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2b700 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2b710 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a  PILLFLAG_OFF );.
2b720 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2b730 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b740 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e   SPILLFLAG_NOSYN
2b750 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  C );.  if( pPage
2b760 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20  r->doNotSpill.  
2b770 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f   && ((pPager->do
2b780 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c  NotSpill & (SPIL
2b790 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53  LFLAG_ROLLBACK|S
2b7a0 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d  PILLFLAG_OFF))!=
2b7b0 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  0.      || (pPg-
2b7c0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
2b7d0 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20  EED_SYNC)!=0).  
2b7e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b7f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2b800 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
2b810 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
2b820 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
2b830 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e    /* Write a sin
2b840 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68  gle frame for th
2b850 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c  is page to the l
2b860 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
2b870 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2b880 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a  Required(pPg); .
2b890 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b8a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2b8b0 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
2b8c0 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  es(pPager, pPg, 
2b8d0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
2b8e0 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
2b8f0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
2b900 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
2b910 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
2b920 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2b930 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c  EED_SYNC .     |
2b940 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2b950 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
2b960 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20  ACHEMOD.    ){. 
2b970 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
2b980 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29  urnal(pPager, 1)
2b990 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
2b9a0 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
2b9b0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
2b9c0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2b9d0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
2b9e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b9f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2ba00 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
2ba10 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2ba20 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )==0 );.      rc
2ba30 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
2ba40 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20  agelist(pPager, 
2ba50 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
2ba60 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
2ba70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f  age as clean. */
2ba80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ba90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45  E_OK ){.    PAGE
2baa0 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20  RTRACE(("STRESS 
2bab0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2bac0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2bad0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2bae0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2baf0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
2bb00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  }..  return page
2bb10 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2bb20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rc); .}../*.** F
2bb30 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66 65 72  lush all unrefer
2bb40 65 6e 63 65 64 20 64 69 72 74 79 20 70 61 67 65  enced dirty page
2bb50 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  s to disk..*/.in
2bb60 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c  t sqlite3PagerFl
2bb70 75 73 68 28 50 61 67 65 72 20 2a 70 50 61 67 65  ush(Pager *pPage
2bb80 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  r){.  int rc = p
2bb90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2bba0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
2bbb0 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74      PgHdr *pList
2bbc0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2bbd0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
2bbe0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
2bbf0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
2bc00 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
2bc10 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  r) );.    while(
2bc20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2bc30 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  & pList ){.     
2bc40 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20   PgHdr *pNext = 
2bc50 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2bc60 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
2bc70 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
2bc80 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 74 72     rc = pagerStr
2bc90 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61 67 65  ess((void*)pPage
2bca0 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r, pList);.     
2bcb0 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d   }.      pList =
2bcc0 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20   pNext;.    }.  
2bcd0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2bce0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2bcf0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2bd00 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
2bd10 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
2bd20 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
2bd30 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
2bd40 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
2bd50 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
2bd60 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
2bd70 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
2bd80 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
2bd90 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
2bda0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
2bdb0 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
2bdc0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
2bdd0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
2bde0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
2bdf0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
2be00 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2be10 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
2be20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
2be30 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
2be40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
2be50 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
2be60 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
2be70 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
2be80 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
2be90 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
2bea0 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
2beb0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
2bec0 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
2bed0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
2bee0 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
2bef0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2bf00 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
2bf10 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2bf20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
2bf30 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
2bf40 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
2bf50 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
2bf60 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
2bf70 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
2bf80 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
2bf90 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
2bfa0 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
2bfb0 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
2bfc0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
2bfd0 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
2bfe0 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
2bff0 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
2c000 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
2c010 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
2c020 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
2c030 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
2c040 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
2c050 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
2c060 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
2c070 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  the PAGER_* flag
2c080 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
2c090 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
2c0a0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
2c0b0 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
2c0c0 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
2c0d0 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
2c0e0 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
2c0f0 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
2c100 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
2c110 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
2c120 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
2c130 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
2c140 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
2c150 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
2c160 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
2c170 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
2c180 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
2c190 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
2c1a0 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
2c1b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2c1c0 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
2c1d0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
2c1e0 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
2c1f0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
2c200 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
2c210 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
2c220 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
2c230 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
2c240 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
2c250 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2c260 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
2c270 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
2c280 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
2c290 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
2c2a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2c2b0 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
2c2c0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
2c2d0 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
2c2e0 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
2c2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2c300 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
2c310 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
2c320 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2c330 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
2c340 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2c350 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
2c360 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
2c370 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
2c380 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
2c390 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
2c3a0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2c3b0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c3d0 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
2c3e0 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
2c3f0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20   int vfsFlags,  
2c400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2c410 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
2c420 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
2c430 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f  .xOpen() */.  vo
2c440 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
2c450 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69  Page*) /* Functi
2c460 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69  on to reinitiali
2c470 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  ze pages */.){. 
2c480 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
2c490 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
2c4a0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
2c4b0 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
2c4c0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
2c4d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c4e0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
2c4f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2c500 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
2c510 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2c520 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
2c530 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
2c540 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
2c550 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
2c560 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2c570 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
2c580 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
2c590 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
2c5a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2c5b0 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
2c5c0 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
2c5d0 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
2c5e0 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
2c5f0 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
2c600 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2c610 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
2c620 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
2c630 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
2c640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2c650 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
2c660 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
2c670 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2c680 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
2c690 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
2c6a0 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
2c6b0 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
2c6c0 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
2c6d0 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
2c6e0 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65    int pcacheSize
2c6f0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2c700 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a  Size();       /*
2c710 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2c720 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f  te for PCache */
2c730 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c  .  u32 szPageDfl
2c740 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2c750 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f  LT_PAGE_SIZE;  /
2c760 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73  * Default page s
2c770 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ize */.  const c
2c780 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20  har *zUri = 0;  
2c790 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f    /* URI args to
2c7a0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e   copy */.  int n
2c7b0 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Uri = 0;        
2c7c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c7d0 20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72   bytes of URI ar
2c7e0 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a  gs at *zUri */..
2c7f0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
2c800 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
2c810 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65  s required for e
2c820 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ach journal file
2c830 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68  -handle.  ** (th
2c840 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74  ere are two of t
2c850 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f  hem, the main jo
2c860 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75  urnal and the su
2c870 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a  b-journal).  */.
2c880 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2c890 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2c8a0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
2c8b0 66 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  fs));..  /* Set 
2c8c0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
2c8d0 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
2c8e0 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
2c8f0 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
2c900 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  er = 0;..#ifndef
2c910 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
2c920 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67  ORYDB.  if( flag
2c930 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59  s & PAGER_MEMORY
2c940 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20   ){.    memDb = 
2c950 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  1;.    if( zFile
2c960 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2c970 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50  e[0] ){.      zP
2c980 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2c990 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69  3DbStrDup(0, zFi
2c9a0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
2c9b0 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
2c9c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2c9d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2c9e0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2c9f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2ca00 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2ca10 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
2ca20 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2ca30 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
2ca40 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
2ca50 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
2ca60 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
2ca70 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
2ca80 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
2ca90 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
2caa0 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
2cab0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2cac0 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
2cad0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
2cae0 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
2caf0 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
2cb00 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2cb10 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2cb20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2cb30 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2cb40 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2cb50 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
2cb60 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
2cb70 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e  locRaw(0, nPathn
2cb80 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
2cb90 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
2cba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2cbb0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2cbc0 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e      }.    zPathn
2cbd0 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d  ame[0] = 0; /* M
2cbe0 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c  ake sure initial
2cbf0 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c  ized even if Ful
2cc00 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c  lPathname() fail
2cc10 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  s */.    rc = sq
2cc20 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
2cc30 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
2cc40 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
2cc50 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2cc60 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2cc70 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2cc80 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  hname);.    z = 
2cc90 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d  zUri = &zFilenam
2cca0 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
2ccb0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b  0(zFilename)+1];
2ccc0 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
2ccd0 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  {.      z += sql
2cce0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2ccf0 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  1;.      z += sq
2cd00 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2cd10 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55  +1;.    }.    nU
2cd20 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d  ri = (int)(&z[1]
2cd30 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73   - zUri);.    as
2cd40 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b  sert( nUri>=0 );
2cd50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2cd60 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e  ITE_OK && nPathn
2cd70 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61  ame+8>pVfs->mxPa
2cd80 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
2cd90 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
2cda0 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  s taken when the
2cdb0 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65   journal path re
2cdc0 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
2cdd0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2cde0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c  being opened wil
2cdf0 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70  l be more than p
2ce00 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
2ce10 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69        ** bytes i
2ce20 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d  n length. This m
2ce30 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
2ce40 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  e cannot be open
2ce50 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ed,.      ** as 
2ce60 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
2ce70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ossible to open 
2ce80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ce90 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a   or even.      *
2cea0 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f  * check for a ho
2ceb0 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t-journal before
2cec0 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   reading..      
2ced0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
2cee0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2cef0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
2cf00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cf10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2cf20 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2cf30 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
2cf40 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
2cf50 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2cf60 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50  memory for the P
2cf70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
2cf80 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74  PCache object, t
2cf90 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69  he.  ** three fi
2cfa0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
2cfb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cfc0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a  e name and the j
2cfd0 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
2cfe0 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f  e name. The layo
2cff0 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20  ut in memory is 
2d000 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
2d010 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20  .  **     Pager 
2d020 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2d030 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f            (sizeo
2d040 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a  f(Pager) bytes).
2d050 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20    **     PCache 
2d060 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2d070 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2d080 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79  3PcacheSize() by
2d090 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2d0a0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64  tabase file hand
2d0b0 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70  le            (p
2d0c0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79  Vfs->szOsFile by
2d0d0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75  tes).  **     Su
2d0e0 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  b-journal file h
2d0f0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a  andle         (j
2d100 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2d110 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d  ytes).  **     M
2d120 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
2d130 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28   handle        (
2d140 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2d150 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2d160 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  Database file na
2d170 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2d180 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74  (nPathname+1 byt
2d190 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75  es).  **     Jou
2d1a0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20  rnal file name  
2d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2d1c0 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65  athname+8+1 byte
2d1d0 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d  s).  */.  pPtr =
2d1e0 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61   (u8 *)sqlite3Ma
2d1f0 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f  llocZero(.    RO
2d200 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2d210 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20  ger)) +      /* 
2d220 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2d230 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63  */.    ROUND8(pc
2d240 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20  acheSize) +     
2d250 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20        /* PCache 
2d260 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f  object */.    RO
2d270 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2d280 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20  ile) +       /* 
2d290 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  The main db file
2d2a0 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
2d2b0 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20  ileSize * 2 +   
2d2c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77         /* The tw
2d2d0 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  o journal files 
2d2e0 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  */ .    nPathnam
2d2f0 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20  e + 1 + nUri +  
2d300 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
2d310 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68  ame */.    nPath
2d320 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20  name + 8 + 2    
2d330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f            /* zJo
2d340 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
2d350 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2d360 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65  .    + nPathname
2d370 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20   + 4 + 2        
2d380 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23      /* zWal */.#
2d390 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73  endif.  );.  ass
2d3a0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2d3b0 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45  ALIGNMENT(SQLITE
2d3c0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72  _INT_TO_PTR(jour
2d3d0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b  nalFileSize)) );
2d3e0 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a  .  if( !pPtr ){.
2d3f0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d400 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2d410 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d420 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2d430 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
2d440 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
2d450 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
2d460 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
2d470 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
2d480 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
2d490 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
2d4a0 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
2d4b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d4c0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
2d4d0 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
2d4e0 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
2d4f0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2d500 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
2d510 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
2d520 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
2d530 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d540 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2d550 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
2d560 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
2d570 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2d580 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2d590 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
2d5a0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2d5b0 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
2d5c0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2d5d0 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
2d5e0 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
2d5f0 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
2d600 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2d610 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
2d620 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2d630 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20  nPathname>0 );. 
2d640 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
2d650 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
2d660 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
2d670 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20  e + 1 + nUri);. 
2d680 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2d690 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
2d6a0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d6b0 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69  e);.    if( nUri
2d6c0 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65   ) memcpy(&pPage
2d6d0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
2d6e0 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c  thname+1], zUri,
2d6f0 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2d700 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
2d710 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
2d720 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d730 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2d740 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2d750 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30  me], "-journal\0
2d760 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73  00", 8+2);.    s
2d770 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2d780 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2d790 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ame, pPager->zJo
2d7a0 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20  urnal);.#ifndef 
2d7b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2d7c0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c      pPager->zWal
2d7d0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   = &pPager->zJou
2d7e0 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38  rnal[nPathname+8
2d7f0 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  +1];.    memcpy(
2d800 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50  pPager->zWal, zP
2d810 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2d820 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2d830 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50  &pPager->zWal[nP
2d840 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c  athname], "-wal\
2d850 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20  000", 4+1);.    
2d860 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2d870 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2d880 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57  name, pPager->zW
2d890 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  al);.#endif.    
2d8a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2d8b0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d   zPathname);.  }
2d8c0 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
2d8d0 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72  = pVfs;.  pPager
2d8e0 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
2d8f0 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Flags;..  /* Ope
2d900 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
2d910 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2d920 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2d930 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
2d940 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
2d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d960 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
2d970 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
2d980 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2d990 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2d9a0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d9b0 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
2d9c0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
2d9d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65  .    assert( !me
2d9e0 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f  mDb );.    readO
2d9f0 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
2da00 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2da10 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2da20 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
2da30 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
2da40 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2da50 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
2da60 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
2da70 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
2da80 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
2da90 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
2daa0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2dab0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2dac0 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
2dad0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2dae0 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
2daf0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2db00 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
2db10 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
2db20 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
2db30 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
2db40 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
2db50 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
2db60 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2db70 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
2db80 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2db90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dba0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2dbb0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2dbc0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2dbd0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66  r->fd);.      if
2dbe0 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  ( !readOnly ){. 
2dbf0 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72         setSector
2dc00 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2dc10 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2dc20 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2dc30 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
2dc40 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2dc50 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  IZE);.        if
2dc60 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
2dc70 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
2dc80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2dc90 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2dca0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2dcb0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2dcc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dcd0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2dce0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2dcf0 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
2dd00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2dd10 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2dd20 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2dd30 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2dd40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dd50 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2dd60 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2dd70 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a  WRITE.        {.
2dd80 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
2dd90 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2dda0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2ddb0 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
2ddc0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2ddd0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2dde0 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2ddf0 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2de00 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2de10 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2de20 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2de30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
2de40 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
2de50 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
2de60 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2de70 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
2de80 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
2de90 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2dea0 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
2deb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2dec0 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2dee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2def0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2df00 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2df10 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65  >noLock = sqlite
2df20 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2df30 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b  ilename, "nolock
2df40 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
2df50 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49   (iDc & SQLITE_I
2df60 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21  OCAP_IMMUTABLE)!
2df70 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
2df80 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2df90 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d  (zFilename, "imm
2dfa0 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20  utable", 0) ){. 
2dfb0 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67           vfsFlag
2dfc0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2dfd0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2dfe0 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69       goto act_li
2dff0 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20  ke_temp_file;.  
2e000 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2e010 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
2e020 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2e030 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
2e040 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
2e050 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2e060 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
2e070 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
2e080 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2e090 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
2e0a0 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
2e0b0 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
2e0c0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
2e0d0 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
2e0e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2e0f0 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
2e100 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
2e110 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
2e120 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
2e130 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
2e140 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
2e150 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
2e160 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
2e170 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
2e180 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
2e190 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
2e1a0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  ournal..    **. 
2e1b0 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2e1c0 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20  h also runs for 
2e1d0 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20  files marked as 
2e1e0 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a  immutable..    *
2e1f0 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  / .act_like_temp
2e200 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46  _file:.    tempF
2e210 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2e220 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2e230 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20  GER_READER;     
2e240 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c  /* Pretend we al
2e250 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
2e260 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  k */.    pPager-
2e270 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49  >eLock = EXCLUSI
2e280 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50  VE_LOCK;    /* P
2e290 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e  retend we are in
2e2a0 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20   EXCLUSIVE mode 
2e2b0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
2e2c0 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20  oLock = 1;      
2e2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2e2e0 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  no locking */.  
2e2f0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2e300 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2e310 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2e320 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2e330 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2e340 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2e350 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2e360 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2e370 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2e380 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2e390 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2e3a0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2e3b0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2e3c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2e3d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2e3e0 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2e3f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2e400 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2e410 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2e420 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2e430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e440 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  );.  }..  /* Ini
2e450 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
2e460 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
2e470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e480 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2e490 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
2e4a0 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55      nExtra = ROU
2e4b0 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20  ND8(nExtra);.   
2e4c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
2e4d0 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
2e4e0 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
2e4f0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
2e500 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2e510 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2e520 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2e530 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2e540 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2e550 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2e560 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  d above, free th
2e570 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75  e  Pager structu
2e580 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2e590 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2e5a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e5b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
2e5c0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2e5d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
2e5e0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
2e5f0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73  TmpSpace);.    s
2e600 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
2e610 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
2e620 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
2e630 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
2e640 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
2e650 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
2e660 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e670 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
2e680 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
2e690 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2e6a0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
2e6b0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2e6c0 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
2e6d0 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nal;.  /* pPager
2e6e0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
2e6f0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e700 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
2e710 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2e720 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
2e730 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
2e740 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2e750 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
2e760 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e770 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
2e780 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
2e790 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
2e7a0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
2e7b0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
2e7c0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
2e7d0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e7e0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
2e7f0 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
2e800 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
2e810 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
2e820 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2e830 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2e840 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
2e850 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2e860 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2e870 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
2e880 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
2e890 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
2e8a0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
2e8b0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
2e8c0 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
2e8d0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2e8e0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
2e8f0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
2e900 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
2e910 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
2e920 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
2e930 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73  )readOnly;.  ass
2e940 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
2e950 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
2e960 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
2e970 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
2e980 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66  ->tempFile;.  if
2e990 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
2e9a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e9b0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2e9c0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2e9d0 74 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61  t( pPager->extra
2e9e0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
2e9f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2ea00 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2ea10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ea20 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d  r->walSyncFlags=
2ea30 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2ea40 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79  ( pPager->ckptSy
2ea50 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2ea60 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
2ea70 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b  r->fullSync = 1;
2ea80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74  .    pPager->ext
2ea90 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  raSync = 0;.    
2eaa0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2eab0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2eac0 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
2ead0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2eae0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2eaf0 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43  ORMAL | WAL_SYNC
2eb00 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
2eb10 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
2eb20 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2eb30 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2eb40 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2eb50 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
2eb60 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2eb70 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
2eb80 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
2eb90 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
2eba0 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28  ager->nExtra = (
2ebb0 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50  u16)nExtra;.  pP
2ebc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
2ebd0 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
2ebe0 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
2ebf0 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
2ec00 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2ec10 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70  ger->fd) || temp
2ec20 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63  File );.  setSec
2ec30 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2ec40 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e  .  if( !useJourn
2ec50 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  al ){.    pPager
2ec60 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2ec70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2ec80 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69  E_OFF;.  }else i
2ec90 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
2eca0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2ecb0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2ecc0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
2ecd0 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
2ece0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
2ecf0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2ed00 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
2ed10 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  rg = 0; */.  pPa
2ed20 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
2ed30 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d   xReinit;.  /* m
2ed40 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
2ed50 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
2ed60 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
2ed70 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2ed80 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f  szMmap = SQLITE_
2ed90 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a  DEFAULT_MMAP_SIZ
2eda0 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74  E // will be set
2edb0 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a   by btree.c */..
2edc0 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
2edd0 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
2ede0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20  LITE_OK;.}.../* 
2edf0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
2ee00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
2ee10 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64  s not be deleted
2ee20 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20   or renamed out 
2ee30 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68  from.** under th
2ee40 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  e pager.  Return
2ee50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2ee60 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74  e database is st
2ee70 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68  ill were it ough
2ee80 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69  t.** to be on di
2ee90 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  sk.  Return non-
2eea0 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41  zero (SQLITE_REA
2eeb0 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72  DONLY_DBMOVED or
2eec0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
2eed0 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73  r.** code from s
2eee0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2eef0 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  ) if the databas
2ef00 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69  e has gone missi
2ef10 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
2ef20 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  t databaseIsUnmo
2ef30 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  ved(Pager *pPage
2ef40 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f  r){.  int bHasMo
2ef50 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ved = 0;.  int r
2ef60 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
2ef70 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74  ->tempFile ) ret
2ef80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ef90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2efa0 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ize==0 ) return 
2efb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
2efc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69  ert( pPager->zFi
2efd0 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72  lename && pPager
2efe0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ->zFilename[0] )
2eff0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2f000 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
2f010 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
2f020 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
2f030 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20  , &bHasMoved);. 
2f040 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f050 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
2f060 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f  /* If the HAS_MO
2f070 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  VED file-control
2f080 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65   is unimplemente
2f090 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  d, assume that t
2f0a0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68  he file.    ** h
2f0b0 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65  as not been move
2f0c0 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20  d.  That is the 
2f0d0 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76  historical behav
2f0e0 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70  ior of SQLite: p
2f0f0 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76  rior to.    ** v
2f100 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74  ersion 3.8.3, it
2f110 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a   never checked *
2f120 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
2f130 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
2f140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f150 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a  && bHasMoved ){.
2f160 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f170 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
2f180 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2f190 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
2f1a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2f1b0 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
2f1c0 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
2f1d0 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
2f1e0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
2f1f0 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
2f200 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2f210 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
2f220 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
2f230 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
2f240 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
2f250 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
2f260 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
2f270 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
2f280 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
2f290 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
2f2a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
2f2b0 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
2f2c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2f2d0 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
2f2e0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
2f2f0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2f300 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
2f310 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
2f320 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
2f330 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2f340 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
2f350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2f360 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2f370 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
2f380 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
2f390 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
2f3a0 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
2f3b0 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
2f3c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2f3d0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
2f3e0 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
2f3f0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
2f400 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2f410 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
2f420 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
2f430 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
2f440 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
2f450 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
2f460 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
2f470 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
2f480 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
2f490 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
2f4a0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2f4b0 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
2f4c0 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
2f4d0 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
2f4e0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
2f4f0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2f500 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2f510 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2f520 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
2f530 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
2f540 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
2f550 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
2f560 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
2f570 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
2f580 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
2f590 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
2f5a0 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
2f5b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2f5c0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2f5d0 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
2f5e0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
2f5f0 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
2f600 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
2f610 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2f620 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
2f630 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
2f640 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f650 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2f660 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
2f670 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
2f680 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
2f690 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2f6a0 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
2f6b0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2f6c0 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
2f6d0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2f6e0 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
2f6f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2f700 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
2f710 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
2f720 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2f730 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2f740 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2f750 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
2f760 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2f770 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
2f780 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f790 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
2f7a0 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
2f7b0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2f7c0 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
2f7d0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
2f7e0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
2f7f0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2f800 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
2f810 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
2f820 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2f830 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2f840 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2f850 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2f860 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2f870 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
2f880 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2f890 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2f8a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f8b0 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
2f8c0 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
2f8d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2f8e0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
2f8f0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2f900 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2f910 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2f920 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2f930 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2f940 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
2f950 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
2f960 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
2f970 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2f980 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
2f990 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
2f9a0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
2f9b0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
2f9c0 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
2f9d0 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
2f9e0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
2f9f0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2fa00 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2fa10 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
2fa20 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
2fa30 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
2fa40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fa50 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
2fa60 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
2fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fa80 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
2fa90 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2faa0 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
2fab0 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
2fac0 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
2fad0 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
2fae0 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
2faf0 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
2fb00 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
2fb10 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
2fb20 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
2fb30 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2fb40 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
2fb50 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
2fb60 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2fb70 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
2fb80 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
2fb90 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
2fba0 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
2fbb0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2fbc0 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
2fbd0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
2fbe0 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
2fbf0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
2fc00 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
2fc10 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
2fc20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
2fc30 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
2fc40 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
2fc50 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
2fc60 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
2fc70 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
2fc80 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
2fc90 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
2fca0 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
2fcb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2fcc0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2fcd0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
2fce0 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
2fcf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2fd00 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
2fd10 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
2fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fd30 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2fd40 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
2fd50 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
2fd60 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
2fd70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  File==0 );.     
2fd80 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
2fd90 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
2fda0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2fdb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fdc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2fdd0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a  he database is z
2fde0 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a  ero pages in siz
2fdf0 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  e, that means th
2fe00 61 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68  at either (1) th
2fe10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
2fe20 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e  rnal is a remnan
2fe30 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64  t from a prior d
2fe40 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2fe50 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65   same name where
2fe60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2fe70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75  database file bu
2fe80 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  t not the journa
2fe90 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f  l was deleted, o
2fea0 72 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61  r (2) the initia
2feb0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61  l.        ** tra
2fec0 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f  nsaction that po
2fed0 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61  pulates a new da
2fee0 74 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20  tabase is being 
2fef0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
2ff00 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65       ** In eithe
2ff10 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72  r case, the jour
2ff20 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20  nal file can be 
2ff30 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65  deleted.  Howeve
2ff40 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20  r, take care.   
2ff50 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64       ** not to d
2ff60 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2ff70 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
2ff80 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65  already open due
2ff90 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a   to.        ** j
2ffa0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53  ournal_mode=PERS
2ffb0 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  IST..        */.
2ffc0 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
2ffd0 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65  e==0 && !jrnlOpe
2ffe0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  n ){.          s
2fff0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
30000 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
30010 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f       if( pagerLo
30020 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
30030 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c  ERVED_LOCK)==SQL
30040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30050 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
30060 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
30070 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
30080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30090 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
300a0 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72  siveMode ) pager
300b0 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
300c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
300d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
300e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
300f0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
30100 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30110 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a          /* The j
30120 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
30130 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
30140 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
30150 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20   reserved.      
30160 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65      ** or greate
30170 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
30180 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77  tabase file. Now
30190 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   check that ther
301a0 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  e is.          *
301b0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e  * at least one n
301c0 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74  on-zero bytes at
301d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
301e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
301f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
30200 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77  there is, then w
30210 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  e consider this 
30220 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f  journal to be ho
30230 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20  t. If not, .    
30240 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
30250 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20  be ignored..    
30260 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30270 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e     if( !jrnlOpen
30280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30290 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
302a0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
302b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
302c0 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
302d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
302e0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
302f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
30300 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
30310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
30320 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
30330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30340 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72            u8 fir
30350 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
30360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30370 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
30380 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72  fd, (void *)&fir
30390 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  st, 1, 0);.     
303a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
303b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
303c0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
303d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
303e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
303f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30400 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
30410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30420 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
30430 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
30440 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30450 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
30460 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20   = (first!=0);. 
30470 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
30480 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
30490 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
304a0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
304b0 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72  annot open the r
304c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
304d0 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
304e0 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20   see if.        
304f0 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20      ** it has a 
30500 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
30510 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
30520 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
30530 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
30540 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
30550 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
30560 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
30570 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
30580 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
30590 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
305a0 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
305b0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
305c0 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
305d0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
305e0 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
305f0 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
30600 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
30610 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
30620 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
30630 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
30640 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
30650 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
30660 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
30670 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
30680 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
30690 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
306a0 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
306b0 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
306c0 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
306d0 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
306e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
306f0 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
30700 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
30710 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
30720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
30730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30740 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
30750 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
30760 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
30770 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
30780 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
30790 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
307a0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
307b0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
307c0 61 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20  agerGet() until 
307d0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
307e0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
307f0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
30800 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
30810 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
30820 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
30830 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
30840 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
30850 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
30860 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
30870 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
30880 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
30890 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
308a0 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
308b0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
308c0 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
308d0 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
308e0 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
308f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
30900 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
30910 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
30920 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
30930 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
30940 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
30950 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
30960 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
30970 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
30980 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
30990 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
309a0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
309b0 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
309c0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
309d0 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
309e0 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
309f0 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
30a00 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
30a10 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
30a20 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
30a30 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
30a40 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
30a50 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
30a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30a70 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
30a80 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
30a90 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
30aa0 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
30ab0 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
30ac0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
30ad0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
30ae0 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
30af0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
30b00 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
30b10 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
30b20 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
30b30 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
30b40 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
30b50 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
30b60 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
30b70 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
30b80 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
30b90 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
30ba0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
30bb0 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
30bc0 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
30bd0 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
30be0 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
30bf0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
30c00 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
30c10 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
30c20 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
30c30 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
30c40 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
30c50 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
30c60 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
30c70 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
30c80 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
30c90 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
30ca0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
30cb0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
30cc0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
30cd0 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
30ce0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
30cf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
30d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d10 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
30d20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
30d30 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
30d40 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
30d50 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
30d60 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
30d70 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
30d80 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
30d90 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
30da0 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
30db0 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
30dc0 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
30dd0 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
30de0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
30df0 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
30e00 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
30e10 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73  s mode.  */.  as
30e20 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
30e30 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
30e40 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
30e50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
30e60 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
30e70 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
30e80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30e90 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30ea0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
30eb0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
30ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30ed0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
30ee0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66  LITE_OK );..  if
30ef0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
30f00 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
30f10 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30f20 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
30f30 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
30f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30f50 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
30f60 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
30f70 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
30f80 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
30f90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30fa0 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
30fb0 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
30fc0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
30fd0 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  );..    rc = pag
30fe0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
30ff0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
31000 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
31010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31020 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
31030 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
31040 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
31050 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
31060 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  CK );.      goto
31070 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a   failed;.    }..
31080 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
31090 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
310a0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
310b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
310c0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
310d0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
310e0 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
310f0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
31100 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
31110 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
31120 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41  ager->eLock<=SHA
31130 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
31140 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
31150 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48  rnal(pPager, &bH
31160 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
31170 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
31180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31190 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
311a0 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74    }.    if( bHot
311b0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
311c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
311d0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
311e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
311f0 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  DONLY_ROLLBACK;.
31200 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
31210 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
31220 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
31230 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
31240 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31250 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
31260 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
31270 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
31280 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
31290 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
312a0 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
312b0 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
312c0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
312d0 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
312e0 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
312f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
31300 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
31310 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
31320 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
31330 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
31340 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
31350 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
31360 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
31370 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
31380 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
31390 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
313a0 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
313b0 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
313c0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
313d0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
313e0 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
313f0 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
31400 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
31410 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
31420 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31430 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
31440 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
31450 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
31460 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
31470 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
31480 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
31490 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
314a0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  e file..      **
314b0 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73  .      ** Unless
314c0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
314d0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
314e0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
314f0 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20  e lock is.      
31500 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
31510 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66   SHARED_LOCK bef
31520 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
31530 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20  n returns..     
31540 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
31550 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
31560 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
31570 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
31580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31590 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
315a0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  ed;.      }. .  
315b0 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
315c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
315d0 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78   and the file ex
315e0 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70  ists on disk, op
315f0 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
31600 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
31610 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
31620 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20  Write access is 
31630 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
31640 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78   .      ** in ex
31650 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
31660 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
31670 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
31680 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20  kept open .     
31690 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79   ** and possibly
316a0 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
316b0 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
316c0 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63  . Also, write-ac
316d0 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  cess .      ** i
316e0 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72  s usually requir
316f0 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ed to finalize t
31700 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f  he journal in jo
31710 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69  urnal_mode=persi
31720 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  st .      ** mod
31730 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20  e (and also for 
31740 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75  journal_mode=tru
31750 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79  ncate on some sy
31760 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a  stems)..      **
31770 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
31780 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
31790 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61  t exist, it usua
317a0 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73  lly means that s
317b0 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74  ome .      ** ot
317c0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
317d0 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
317e0 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
317f0 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
31800 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ** this connecti
31810 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  on obtained the 
31820 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61  exclusive lock a
31830 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20  bove. Or, it .  
31840 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
31850 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
31860 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
31870 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
31880 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
31890 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64  n was called and
318a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
318b0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
318c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
318d0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
318e0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
318f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
31900 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
31910 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
31920 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74        int bExist
31930 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
31940 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
31950 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  al file exists *
31960 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
31970 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
31980 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
31990 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
319a0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
319b0 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73  S_EXISTS, &bExis
319c0 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ts);.        if(
319d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
319e0 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20  & bExists ){.   
319f0 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
31a00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
31a10 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
31a20 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
31a30 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
31a40 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
31a50 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
31a60 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
31a70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31a80 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
31a90 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31aa0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
31ab0 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
31ac0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
31ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
31ae0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
31af0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
31b00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31b10 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
31b20 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
31b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31b40 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
31b50 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
31b60 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
31b70 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
31b80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31b90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
31ba0 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
31bb0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
31bc0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
31bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
31be0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
31bf0 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
31c00 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
31c10 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
31c20 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
31c30 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
31c40 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
31c50 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
31c60 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
31c70 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
31c80 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74  t cache.  Sync t
31c90 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62  he hot journal b
31ca0 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20  efore playing.  
31cb0 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73      ** it back s
31cc0 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73  ince the process
31cd0 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e   that crashed an
31ce0 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a  d left the hot j
31cf0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
31d00 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74  probably did not
31d10 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20   sync it and we 
31d20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
31d30 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20  always sync.    
31d40 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
31d50 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20   before playing 
31d60 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  it back..      *
31d70 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
31d80 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31d90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
31da0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
31db0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
31dc0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
31dd0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
31de0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31e00 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
31e10 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
31e20 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
31e30 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  le);.          p
31e40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
31e50 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
31e60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
31e70 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
31e80 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
31e90 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c          pagerUnl
31ea0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
31eb0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
31ec0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
31ed0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
31ef0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
31f00 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
31f10 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
31f20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  to open.        
31f30 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20  ** or roll back 
31f40 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68  a hot-journal wh
31f50 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ile holding an E
31f60 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
31f70 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
31f80 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75  ger_unlock() rou
31f90 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
31fa0 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  led before retur
31fb0 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20  ning to unlock. 
31fc0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69         ** the fi
31fd0 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63  le. If the unloc
31fe0 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c  k attempt fails,
31ff0 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63   then Pager.eLoc
32000 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20  k must be.      
32010 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e    ** set to UNKN
32020 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68  OWN_LOCK (see th
32030 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
32040 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20  the #define for 
32050 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e  .        ** UNKN
32060 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66  OWN_LOCK above f
32070 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
32080 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  n). .        **.
32090 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72          ** In or
320a0 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72  der to get pager
320b0 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20  _unlock() to do 
320c0 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e  this, set Pager.
320d0 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20  eState to.      
320e0 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
320f0 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f   now. This is no
32100 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74  t actually count
32110 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69  ed as a transiti
32120 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  on.        ** to
32130 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20   ERROR state in 
32140 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61  the state diagra
32150 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  m at the top of 
32160 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20  this file,.     
32170 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
32180 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d  now that the sam
32190 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
321a0 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65  unlock() will ve
321b0 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68  ry.        ** sh
321c0 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e  ortly transition
321d0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
321e0 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74  t to the OPEN st
321f0 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20  ate. Calling.   
32200 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70       ** assert_p
32210 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75  ager_state() wou
32220 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20  ld fail now, as 
32230 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
32240 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
32250 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52    ** to be in ER
32260 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
32270 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75  here are zero ou
32280 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a  tstanding page .
32290 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72          ** refer
322a0 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ences..        *
322b0 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  /.        pager_
322c0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
322d0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
322e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
322f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32300 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32310 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
32320 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
32330 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  er->eLock==SHARE
32340 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20  D_LOCK).        
32350 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
32360 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
32370 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48  pPager->eLock>SH
32380 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
32390 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
323a0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
323b0 46 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e  File && pPager->
323c0 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
323d0 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  k ){.      /* Th
323e0 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
323f0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
32400 69 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20  ired then check 
32410 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
32420 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
32430 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
32440 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
32450 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
32460 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20  .      ** flush 
32470 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20  the cache.  The 
32480 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
32490 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  k flag prevents 
324a0 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  this from.      
324b0 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20  ** occurring on 
324c0 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 61  the very first a
324d0 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c  ccess to a file,
324e0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76   in order to sav
324f0 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e  e a.      ** sin
32500 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  gle unnecessary 
32510 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
32520 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72  call at the star
32530 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  t-up..      **. 
32540 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
32550 20 63 68 61 6e 67 65 73 20 61 72 65 20 64 65 74   changes are det
32560 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
32570 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
32580 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
32590 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
325a0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
325b0 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
325c0 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
325d0 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
325e0 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
325f0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
32600 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
32610 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
32620 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
32630 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
32640 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
32650 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
32660 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
32670 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
32680 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
32690 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
326a0 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
326b0 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
326c0 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
326d0 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
326e0 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
326f0 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
32700 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
32710 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
32720 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
32730 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
32740 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  e = 0;.      cha
32750 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
32760 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
32770 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20  leVers)];..     
32780 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
32790 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
327a0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
327b0 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64  rc ) goto failed
327c0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  ;..      if( nPa
327d0 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ge>0 ){.        
327e0 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
327f0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
32800 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
32810 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
32820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
32830 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
32840 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
32850 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
32860 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66   24);.        if
32870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32880 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
32890 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
328a0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
328b0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
328c0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
328d0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
328e0 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
328f0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
32900 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
32910 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
32920 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
32930 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
32940 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
32950 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
32960 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
32970 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  r);..        /* 
32980 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62 61  Unmap the databa
32990 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70  se file. It is p
329a0 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65 78 74  ossible that ext
329b0 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a  ernal processes.
329c0 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68          ** may h
329d0 61 76 65 20 74 72 75 6e 63 61 74 65 64 20 74 68  ave truncated th
329e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
329f0 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65  and then extende
32a00 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20  d it back.      
32a10 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67    ** to its orig
32a20 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20  inal size while 
32a30 74 68 69 73 20 70 72 6f 63 65 73 73 20 77 61 73  this process was
32a40 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c   not holding a l
32a50 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ock..        ** 
32a60 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
32a70 72 65 20 6d 61 79 20 65 78 69 73 74 20 61 20 50  re may exist a P
32a80 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e  ager.pMap mappin
32a90 67 20 74 68 61 74 20 61 70 70 65 61 72 73 0a 20  g that appears. 
32aa0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
32ab0 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 20 62  the right size b
32ac0 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  ut is not actual
32ad0 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20  ly valid. Avoid 
32ae0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
32af0 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20 75  possibility by u
32b00 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62 20  nmapping the db 
32b10 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
32b20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
32b30 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
32b40 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65     sqlite3OsUnfe
32b50 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
32b60 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  0, 0);.        }
32b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
32b80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
32b90 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e  is a WAL file in
32ba0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
32bb0 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61  , open this data
32bc0 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20  base in WAL.    
32bd0 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69  ** mode. Otherwi
32be0 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  se, the followin
32bf0 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  g function call 
32c00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
32c10 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
32c20 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
32c30 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64  t(pPager);.#ifnd
32c40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
32c50 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  AL.    assert( p
32c60 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c  Pager->pWal==0 |
32c70 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
32c80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
32c90 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
32ca0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
32cb0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
32cc0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
32cd0 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  = pagerBeginRead
32ce0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
32cf0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
32d00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
32d10 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
32d20 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
32d30 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  N && rc==SQLITE_
32d40 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
32d50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
32d60 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64  ager, &pPager->d
32d70 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61  bSize);.  }.. fa
32d80 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
32d90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32da0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
32db0 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  );.    pager_unl
32dc0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
32dd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32de0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
32df0 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  PEN );.  }else{.
32e00 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
32e10 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
32e20 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 68  R;.    pPager->h
32e30 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
32e40 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
32e50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
32e60 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
32e70 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
32e80 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63  ed zero, rollbac
32e90 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  k any active.** 
32ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
32eb0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
32ec0 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
32ed0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
32ee0 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74  EXCLUSIVE when t
32ef0 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
32f00 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c  to in.** the rol
32f10 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
32f20 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74  he unlock is not
32f30 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74   performed and t
32f40 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69  here is.** nothi
32f50 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  ng to rollback, 
32f60 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
32f70 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
32f80 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
32f90 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
32fa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32fb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d    if( pPager->nM
32fc0 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71  mapOut==0 && (sq
32fd0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
32fe0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
32ff0 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  che)==0) ){.    
33000 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
33010 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
33020 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71    }.}../*.** Acq
33030 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
33040 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
33050 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50  pgno in pager pP
33060 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20  ager (a page.** 
33070 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79  reference has ty
33080 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20  pe DbPage*). If 
33090 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
330a0 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73  ference is .** s
330b0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
330c0 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69  ined, it is copi
330d0 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e  ed to *ppPage an
330e0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
330f0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
33100 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
33110 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
33120 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73  the cache, it is
33130 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
33140 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20  therwise, a new 
33150 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61  page object is a
33160 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
33170 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ulated with data
33180 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68  .** read from th
33190 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
331a0 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
331b0 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
331c0 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20  e may.** choose 
331d0 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  not to allocate 
331e0 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
331f0 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20  t and may reuse 
33200 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f  an existing.** o
33210 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75  bject with no ou
33220 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
33230 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nces..**.** The 
33240 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
33250 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
33260 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
33270 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  zed to zeros the
33280 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20   .** first time 
33290 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
332a0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66   into memory. If
332b0 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73   the page reques
332c0 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61  ted is .** alrea
332d0 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  dy in the cache 
332e0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
332f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
33300 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20  en the extra.** 
33310 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20  data is left as 
33320 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  it was when the 
33330 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20  page object was 
33340 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  last used..**.**
33350 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
33360 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65   image is smalle
33370 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
33380 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20  sted page or if 
33390 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76  a .** non-zero v
333a0 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61  alue is passed a
333b0 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  s the noContent 
333c0 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68  parameter and th
333d0 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
333e0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
333f0 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ady stored in th
33400 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f  e cache, then no
33410 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b   .** actual disk
33420 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e   read occurs. In
33430 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d   this case the m
33440 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
33450 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69  he .** page is i
33460 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
33470 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20  l zeros. .**.** 
33480 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
33490 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
334a0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
334b0 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  re about the con
334c0 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
334d0 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
334e0 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  s in two scenari
334f0 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
33500 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
33510 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
33520 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
33530 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
33540 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
33550 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
33560 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
33570 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
33580 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
33590 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
335a0 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
335b0 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
335c0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
335d0 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
335e0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
335f0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
33600 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
33610 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
33620 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
33630 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
33640 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
33650 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
33660 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
33670 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
33680 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
33690 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
336a0 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
336b0 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
336c0 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
336d0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
336e0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
336f0 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
33700 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
33710 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
33720 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
33730 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
33740 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
33750 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
33760 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
33770 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33780 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
33790 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
337a0 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
337b0 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
337c0 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
337d0 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
337e0 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
337f0 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
33800 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
33810 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
33820 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
33830 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
33840 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
33850 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
33860 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
33870 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
33880 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
33890 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
338a0 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
338b0 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
338c0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
338d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
338e0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
338f0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
33900 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
33910 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
33920 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
33930 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
33940 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
33950 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
33960 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
33970 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
33980 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
33990 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
339a0 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
339b0 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
339c0 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
339d0 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
339e0 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
339f0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
33a00 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
33a10 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
33a20 33 50 61 67 65 72 47 65 74 28 0a 20 20 50 61 67  3PagerGet(.  Pag
33a30 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
33a40 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
33a50 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
33a60 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
33a70 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
33a80 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
33a90 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
33aa0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
33ab0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
33ac0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
33ad0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
33ae0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
33af0 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
33b00 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
33b10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33b20 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ;.  PgHdr *pPg =
33b30 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65   0;.  u32 iFrame
33b40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33b50 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74        /* Frame t
33b60 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20  o read from WAL 
33b70 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  file */.  const 
33b80 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20  int noContent = 
33b90 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47  (flags & PAGER_G
33ba0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a  ET_NOCONTENT);..
33bb0 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70    /* It is accep
33bc0 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72  table to use a r
33bd0 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20  ead-only (mmap) 
33be0 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67  page for any pag
33bf0 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61  e except.  ** pa
33c00 67 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73  ge 1 if there is
33c10 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
33c20 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68  ction open or th
33c30 65 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e  e ACQUIRE_READON
33c40 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73  LY.  ** flag was
33c50 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
33c60 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f  e caller. And so
33c70 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20   long as the db 
33c80 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74  is not a .  ** t
33c90 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
33ca0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
33cb0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
33cc0 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e  bMmapOk = (pgno>
33cd0 31 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50  1 && USEFETCH(pP
33ce0 61 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61  ager).   && (pPa
33cf0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33d00 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
33d10 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
33d20 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65  READONLY)).#ifde
33d30 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
33d40 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  EC.   && pPager-
33d50 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69  >xCodec==0.#endi
33d60 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 74  f.  );..  /* Opt
33d70 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  imization note: 
33d80 20 41 64 64 69 6e 67 20 74 68 65 20 22 70 67 6e   Adding the "pgn
33d90 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f 72  o<=1" term befor
33da0 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65  e "pgno==0" here
33db0 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65  .  ** allows the
33dc0 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
33dd0 7a 65 72 20 74 6f 20 72 65 75 73 65 20 74 68 65  zer to reuse the
33de0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
33df0 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65  "pgno>1".  ** te
33e00 73 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  st in the previo
33e10 75 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e  us statement, an
33e20 64 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67 20  d avoid testing 
33e30 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20  pgno==0 in the. 
33e40 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20   ** common case 
33e50 77 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c 61  where pgno is la
33e60 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67  rge. */.  if( pg
33e70 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30  no<=1 && pgno==0
33e80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
33e90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
33ea0 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
33eb0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33ec0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
33ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
33ee0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
33ef0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
33f00 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  rt( noContent==0
33f10 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29   || bMmapOk==0 )
33f20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
33f30 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
33f40 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20  edLock==1 );..  
33f50 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
33f60 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
33f70 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
33f80 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
33f90 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
33fa0 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
33fb0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
33fc0 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
33fd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
33fe0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
33ff0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
34000 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
34010 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62  }else{.    if( b
34020 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55  MmapOk && pagerU
34030 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
34040 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34050 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
34060 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
34070 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
34080 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34090 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
340a0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
340b0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62      }..    if( b
340c0 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65  MmapOk && iFrame
340d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 6f 69  ==0 ){.      voi
340e0 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20  d *pData = 0;.. 
340f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34100 33 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d  3OsFetch(pPager-
34110 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  >fd, .          
34120 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20  (i64)(pgno-1) * 
34130 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34140 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
34150 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20 20  ze, &pData.     
34160 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72   );..      if( r
34170 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
34180 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
34190 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
341a0 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52  ate>PAGER_READER
341b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
341c0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
341d0 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
341e0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
341f0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
34200 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
34210 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
34220 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63      rc = pagerAc
34230 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61  quireMapPage(pPa
34240 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61  ger, pgno, pData
34250 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20  , &pPg);.       
34260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34270 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
34280 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
34290 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61  i64)(pgno-1)*pPa
342a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
342b0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  Data);.        }
342c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67  .        if( pPg
342d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
342e0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
342f0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _OK );.         
34300 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
34310 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
34320 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
34330 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34340 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34360 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34370 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
34380 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20  .    }..    {.  
34390 20 20 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63      sqlite3_pcac
343a0 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a  he_page *pBase;.
343b0 20 20 20 20 20 20 70 42 61 73 65 20 3d 20 73 71        pBase = sq
343c0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
343d0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
343e0 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  , pgno, 3);.    
343f0 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29    if( pBase==0 )
34400 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
34410 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34420 68 53 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e  hStress(pPager->
34430 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26  pPCache, pgno, &
34440 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  pBase);.        
34450 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34460 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61  K ) goto pager_a
34470 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34480 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
34490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
344a0 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  g = *ppPage = 0;
344b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
344c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
344d0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
344e0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
344f0 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  err;.        }. 
34500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
34510 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c   = *ppPage = sql
34520 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
34530 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
34540 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61  Cache, pgno, pBa
34550 73 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  se);.      asser
34560 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 20  t( pPg!=0 );.   
34570 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
34580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34590 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
345a0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
345b0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65  PcacheFetch() re
345c0 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
345d0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  or the.    ** pa
345e0 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  ger was already 
345f0 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
34600 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
34610 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
34620 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67  ..    ** Set pPg
34630 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74   to 0 and jump t
34640 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20  o the exception 
34650 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20  handler.  */.   
34660 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f   pPg = 0;.    go
34670 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
34680 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _err;.  }.  asse
34690 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67  rt( pPg==(*ppPag
346a0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
346b0 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  pPg->pgno==pgno 
346c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
346d0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
346e0 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d   || pPg->pPager=
346f0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 67  =0 );..  if( pPg
34700 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43  ->pPager && !noC
34710 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  ontent ){.    /*
34720 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
34730 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79  e pcache already
34740 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69   contains an ini
34750 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66  tialized copy of
34760 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
34770 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
34780 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a   further ado.  *
34790 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  /.    assert( pg
347a0 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47  no<=PAGER_MAX_PG
347b0 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45  NO && pgno!=PAGE
347c0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
347d0 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) );.    pPager-
347e0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
347f0 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65  T_HIT]++;.    re
34800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34810 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
34820 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
34830 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
34840 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
34850 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
34860 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
34870 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70  ized.  */..    p
34880 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
34890 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ger;..    /* The
348a0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
348b0 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
348c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
348d0 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
348e0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
348f0 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
34900 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63  r the unused loc
34910 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65  king-page, is re
34920 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20  quested. */.    
34930 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
34940 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
34950 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
34960 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
34970 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
34980 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
34990 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
349a0 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
349b0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
349c0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
349d0 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  | !MEMDB );.    
349e0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
349f0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
34a00 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c  r->dbSize<pgno |
34a10 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  | noContent ){. 
34a20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
34a30 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
34a40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
34a50 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
34a60 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34a70 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34a80 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
34a90 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
34aa0 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
34ab0 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
34ac0 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
34ad0 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
34ae0 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
34af0 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
34b00 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
34b10 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
34b20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
34b30 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
34b40 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
34b50 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
34b60 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
34b70 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
34b80 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
34b90 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
34ba0 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
34bb0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
34bc0 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
34bd0 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
34be0 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
34bf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
34c00 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
34c10 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
34c20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
34c30 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
34c40 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
34c50 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
34c60 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
34c70 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
34c80 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
34c90 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
34ca0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
34cb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34cc0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
34cd0 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
34ce0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
34cf0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
34d00 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
34d10 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
34d20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
34d30 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
34d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
34d50 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
34d60 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
34d70 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
34d80 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
34d90 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
34da0 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
34db0 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55        if( pagerU
34dc0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
34dd0 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20   bMmapOk==0 ){. 
34de0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34df0 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
34e00 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
34e10 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
34e20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34e30 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
34e40 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34e60 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
34e70 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
34e80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
34e90 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  at[PAGER_STAT_MI
34ea0 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20  SS]++;.      rc 
34eb0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
34ec0 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , iFrame);.     
34ed0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34ee0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
34ef0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
34f00 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
34f10 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
34f20 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
34f30 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
34f40 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
34f50 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
34f60 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
34f70 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
34f80 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
34f90 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
34fa0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
34fb0 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
34fc0 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
34fd0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
34fe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
34ff0 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
35000 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
35010 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
35020 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
35030 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
35040 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
35050 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
35060 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
35070 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
35080 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a   in cache. .**.*
35090 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
350a0 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
350b0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
350c0 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
350d0 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
350e0 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
350f0 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
35100 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
35110 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
35120 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
35130 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
35140 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
35150 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
35160 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
35170 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
35180 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
35190 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
351a0 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
351b0 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
351c0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
351d0 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
351e0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73   Pgno pgno){.  s
351f0 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61  qlite3_pcache_pa
35200 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
35210 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
35220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
35230 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
35240 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
35250 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  !=0 );.  pPage =
35260 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
35270 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
35280 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20  che, pgno, 0);. 
35290 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d   assert( pPage==
352a0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73  0 || pPager->has
352b0 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29  HeldSharedLock )
352c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  ;.  if( pPage==0
352d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
352e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
352f0 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70  cheFetchFinish(p
35300 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
35310 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a  pgno, pPage);.}.
35320 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
35330 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
35340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
35350 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
35360 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
35370 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
35380 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
35390 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
353a0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
353b0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
353c0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
353d0 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
353e0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
353f0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
35400 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
35410 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
35420 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35430 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65  efNotNull(DbPage
35440 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
35450 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  *pPager;.  asser
35460 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70  t( pPg!=0 );.  p
35470 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
35480 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
35490 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d  flags & PGHDR_MM
354a0 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52  AP ){.    pagerR
354b0 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50  eleaseMapPage(pP
354c0 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
354d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
354e0 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
354f0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
35500 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d  nused(pPager);.}
35510 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
35520 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
35530 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
35540 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
35550 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  refNotNull(pPg);
35560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
35570 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
35580 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
35590 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
355a0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
355b0 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
355c0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
355d0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
355e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
355f0 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
35600 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
35610 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
35620 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
35630 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
35640 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
35650 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
35660 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
35670 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
35680 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
35690 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
356a0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
356b0 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
356c0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
356d0 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
356e0 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
356f0 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
35700 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
35710 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
35720 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
35730 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
35740 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
35750 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
35760 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
35770 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
35780 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
35790 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
357a0 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
357b0 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
357c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
357d0 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
357e0 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
357f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
35800 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
35810 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
35820 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
35830 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
35840 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
35850 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
35860 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
35870 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
35880 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
35890 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
358a0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
358b0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
358c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
358d0 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
358e0 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
358f0 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
35900 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
35910 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
35920 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
35930 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
35940 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
35950 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
35960 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
35970 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
35980 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
35990 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
359a0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
359b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
359c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
359d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
359e0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
359f0 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
35a00 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
35a10 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
35a20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
35a30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35a40 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
35a50 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
35a60 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
35a70 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
35a80 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35a90 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
35aa0 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
35ab0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
35ac0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
35ad0 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f   a no-op.  But o
35ae0 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72  n.  ** the other
35af0 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74   hand, this rout
35b00 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
35b10 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c  led if we are al
35b20 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e  ready in.  ** an
35b30 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f   error state. */
35b40 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
35b50 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
35b60 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
35b70 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21  rrCode;..  if( !
35b80 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
35b90 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  er) && pPager->j
35ba0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
35bb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
35bc0 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  F ){.    pPager-
35bd0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
35be0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
35bf0 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
35c00 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
35c10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
35c20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
35c30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
35c40 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  PT;.    }.  .   
35c50 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
35c60 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
35c70 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
35c80 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  pen. */.    if( 
35c90 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
35ca0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  jfd) ){.      if
35cb0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
35cc0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
35cd0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
35ce0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
35cf0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
35d00 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
35d10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
35d20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
35d30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
35d40 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
35d50 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
35d60 20 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20    int nSpill;.. 
35d70 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
35d80 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
35d90 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
35da0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  = (SQLITE_OPEN_D
35db0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
35dc0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
35dd0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20  URNAL);.        
35de0 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74    nSpill = sqlit
35df0 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70  e3Config.nStmtSp
35e00 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ill;.        }el
35e10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c  se{.          fl
35e20 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
35e30 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
35e40 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c  .          nSpil
35e50 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  l = jrnlBufferSi
35e60 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
35e70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
35e80 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69  .        /* Veri
35e90 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
35ea0 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74  base still has t
35eb0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
35ec0 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20  it did when.    
35ed0 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72      ** it was or
35ee0 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e  iginally opened.
35ef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
35f00 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
35f10 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ed(pPager);.    
35f20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35f30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
35f50 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20 20  ournalOpen (.   
35f60 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
35f70 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
35f80 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
35f90 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20 20  flags, nSpill.  
35fa0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
35fb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35fc0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
35fd0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
35fe0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
35ff0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20  );.    }.  .  . 
36000 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
36010 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
36020 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
36030 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
36040 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  n .    ** the su
36050 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
36060 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
36070 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
36090 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
360a0 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
360b0 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
360c0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  . */.      pPage
360d0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
360e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
360f0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
36100 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
36110 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
36120 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
36130 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
36140 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
36150 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
36160 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
36170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36180 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
36190 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
361a0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
361b0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
361c0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
361d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
361e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
361f0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
36200 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
36210 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
36220 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20  TER_CACHEMOD;.  
36230 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
36240 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
36250 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
36260 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
36270 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
36280 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
36290 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
362a0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
362b0 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
362c0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
362d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
362e0 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
362f0 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75  false, then acqu
36300 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
36310 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
36320 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36330 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
36340 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63  is true, then ac
36350 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
36360 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
36370 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
36380 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
36390 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
363a0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
363b0 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
363c0 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
363d0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
363e0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
363f0 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
36400 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
36410 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
36420 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
36430 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
36440 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
36450 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
36460 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
36470 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
36480 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
36490 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
364a0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
364b0 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
364c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
364d0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
364e0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
364f0 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
36500 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
36510 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
36520 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
36530 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
36540 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
36550 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
36560 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
36570 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
36580 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
36590 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
365a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
365b0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
365c0 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
365d0 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
365e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
365f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
36600 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
36610 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
36620 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65  >errCode;.  asse
36630 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36640 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
36650 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
36660 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29  te<PAGER_ERROR )
36670 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
36680 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
36690 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20  ubjInMemory;..  
366a0 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65  if( ALWAYS(pPage
366b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
366c0 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20  _READER) ){.    
366d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
366e0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
366f0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
36700 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
36710 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
36720 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67   pager is config
36730 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b  ured to use lock
36740 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
36750 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  ve, and an.     
36760 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   ** exclusive lo
36770 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
36780 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  se is not alread
36790 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69  y held, obtain i
367a0 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a  t now..      */.
367b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
367c0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
367d0 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  && sqlite3WalExc
367e0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
367f0 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a  r->pWal, -1) ){.
36800 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
36810 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
36820 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
36830 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
36840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36850 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
36860 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
36870 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
36880 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
36890 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
368a0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
368b0 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65       /* Grab the
368c0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
368d0 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20  he log file. If 
368e0 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72  successful, upgr
368f0 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ade to.      ** 
36900 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
36910 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
36920 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
36930 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
36940 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ler..      ** Th
36950 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
36960 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66  s not invoked if
36970 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
36980 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ion already.    
36990 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77    ** holds the w
369a0 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f  rite-lock. If po
369b0 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65  ssible, the uppe
369c0 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c  r layer will cal
369d0 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  l it..      */. 
369e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
369f0 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72  3WalBeginWriteTr
36a00 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
36a10 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  ->pWal);.    }el
36a20 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  se{.      /* Obt
36a30 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
36a40 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
36a50 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
36a60 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65   exFlag paramete
36a70 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72  r.      ** is tr
36a80 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61  ue, then immedia
36a90 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69  tely upgrade thi
36aa0 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  s to an EXCLUSIV
36ab0 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
36ac0 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65    ** busy-handle
36ad0 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62  r callback can b
36ae0 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72  e used when upgr
36af0 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43  ading to the EXC
36b00 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20  LUSIVE.      ** 
36b10 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
36b20 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
36b30 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
36b40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
36b50 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
36b60 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
36b70 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
36b80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36b90 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  && exFlag ){.   
36ba0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
36bb0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
36bc0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
36bd0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
36be0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
36bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36c00 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f      /* Change to
36c10 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
36c20 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
36c30 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
36c40 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61   sets Pager.eSta
36c50 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54  te to PAGER_WRIT
36c60 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43  ER_LOCKED or CAC
36c70 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77  HEMOD.      ** w
36c80 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70  hen it has an op
36c90 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
36ca0 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d  but never to DBM
36cb0 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a  OD or FINISHED..
36cc0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
36cd0 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73   because in thos
36ce0 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64  e states the cod
36cf0 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
36d00 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
36d10 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
36d20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72  may copy data fr
36d30 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
36d40 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  al into the data
36d50 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66  base .      ** f
36d60 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69  ile as well as i
36d70 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63  nto the page cac
36d80 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20  he. Which would 
36d90 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20  be incorrect in 
36da0 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
36db0 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  de..      */.   
36dc0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
36dd0 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
36de0 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70  _LOCKED;.      p
36df0 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
36e00 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
36e10 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
36e20 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
36e30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
36e40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f       pPager->dbO
36e50 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72  rigSize = pPager
36e60 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
36e70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
36e80 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ff = 0;.    }.. 
36e90 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
36ea0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
36eb0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36ec0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
36ed0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
36ee0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
36ef0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
36f00 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
36f10 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
36f20 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
36f30 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20  Pager) );.  }.. 
36f40 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52   PAGERTRACE(("TR
36f50 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
36f60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
36f70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
36f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
36f90 70 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74 68  page pPg onto th
36fa0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c  e end of the rol
36fb0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
36fc0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
36fd0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67  NOINLINE int pag
36fe0 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62  erAddPageToRollb
36ff0 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72  ackJournal(PgHdr
37000 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
37010 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
37020 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
37030 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
37040 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20  char *pData2;.  
37050 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65  i64 iOff = pPage
37060 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
37070 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
37080 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
37090 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
370a0 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 2a  he page that.  *
370b0 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
370c0 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
370d0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
370e0 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
370f0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
37100 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
37110 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
37120 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
37130 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
37140 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
37150 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r<=pPager->journ
37160 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45 43  alOff );.  CODEC
37170 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  2(pPager, pPg->p
37180 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
37190 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
371a0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44  E_NOMEM_BKPT, pD
371b0 61 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d  ata2);.  cksum =
371c0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
371d0 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
371e0 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66  );..  /* Even if
371f0 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
37200 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ll error occurs 
37210 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
37220 67 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  g the.  ** page 
37230 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  in the block abo
37240 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64  ve, set the need
37250 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74  -sync flag for t
37260 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f 74  he page..  ** Ot
37270 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68  herwise, when th
37280 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
37290 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
372a0 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a 20  e logic in.  ** 
372b0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
372c0 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74  e() will think t
372d0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
372e0 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ds to be restore
372f0 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61  d.  ** in the da
37300 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
37310 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
37320 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
37330 6e 67 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e  ng so,.  ** then
37340 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
37350 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  follow..  */.  p
37360 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
37370 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20  DR_NEED_SYNC;.. 
37380 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
37390 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
373a0 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
373b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
373c0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
373d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
373e0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
373f0 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
37400 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69  ger->pageSize, i
37410 4f 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  Off+4);.  if( rc
37420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
37430 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
37440 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
37450 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50  er->jfd, iOff+pP
37460 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
37470 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20  , cksum);.  if( 
37480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37490 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49 4f  return rc;..  IO
374a0 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
374b0 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
374c0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
374d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 50  , .           pP
374e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
374f0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
37500 7a 65 29 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  ze));.  PAGER_IN
37510 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
37520 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
37530 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a    PAGERTRACE(("J
37540 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
37550 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
37560 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
37570 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
37580 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
37590 0a 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66  .       ((pPg->f
375a0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
375b0 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
375c0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
375d0 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  );..  pPager->jo
375e0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20  urnalOff += 8 + 
375f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
37600 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
37610 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ++;.  assert( pP
37620 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37630 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  !=0 );.  rc = sq
37640 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
37650 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37660 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
37670 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
37680 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
37690 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
376a0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
376b0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
376c0 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
376d0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
376e0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
376f0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
37700 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
37710 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
37720 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37730 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67  *.** Mark a sing
37740 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20  le data page as 
37750 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70  writeable. The p
37760 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
37770 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  nto the .** main
37780 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
37790 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69  journal as requi
377a0 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  red. If the page
377b0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
377c0 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a  .** one of the j
377d0 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72  ournals, the cor
377e0 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
377f0 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a  s set in the .**
37800 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
37810 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65  l bitvec and the
37820 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
37830 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
37840 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f  vecs.** of any o
37850 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61  pen savepoints a
37860 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
37870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
37880 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
37890 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
378a0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
378b0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
378c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
378d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
378e0 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65   not called unle
378f0 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ss a write-trans
37900 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
37910 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74  dy .  ** been st
37920 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e  arted. The journ
37930 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
37940 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61  ay not be open a
37950 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
37960 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63  ** It is never c
37970 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52  alled in the ERR
37980 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  OR state..  */. 
37990 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
379a0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
379b0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
379c0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
379d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
379e0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
379f0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
37a00 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37a10 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
37a20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
37a30 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
37a40 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
37a50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
37a60 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
37a70 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
37a80 79 3d 3d 30 20 29 3b 0a 20 20 43 48 45 43 4b 5f  y==0 );.  CHECK_
37a90 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
37aa0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
37ab0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70  e needs to be op
37ac0 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76  ened. Higher lev
37ad0 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  el routines have
37ae0 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62   already.  ** ob
37af0 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73  tained the neces
37b00 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65  sary locks to be
37b10 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72  gin the write-tr
37b20 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74  ansaction, but t
37b30 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  he.  ** rollback
37b40 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
37b50 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20  ot yet be open. 
37b60 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74  Open it now if t
37b70 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e  his is the case.
37b80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
37b90 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63  is done before c
37ba0 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63  alling sqlite3Pc
37bb0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20  acheMakeDirty() 
37bc0 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20  on the page. .  
37bd0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
37be0 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66   it were done af
37bf0 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  ter calling sqli
37c00 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
37c10 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  ty(), then.  ** 
37c20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f  an error might o
37c30 63 63 75 72 20 61 6e 64 20 74 68 65 20 70 61 67  ccur and the pag
37c40 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20  er would end up 
37c50 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  in WRITER_LOCKED
37c60 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68   state.  ** with
37c70 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73   pages marked as
37c80 20 64 69 72 74 79 20 69 6e 20 74 68 65 20 63 61   dirty in the ca
37c90 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  che..  */.  if( 
37ca0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37cb0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37cc0 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  KED ){.    rc = 
37cd0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
37ce0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
37cf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37d00 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
37d10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
37d20 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
37d30 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
37d40 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
37d50 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37d60 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
37d70 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
37d80 65 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 20  e that is about 
37d90 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61  to be modified a
37da0 73 20 64 69 72 74 79 2e 20 2a 2f 0a 20 20 73 71  s dirty. */.  sq
37db0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
37dc0 69 72 74 79 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  irty(pPg);..  /*
37dd0 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a   If a rollback j
37de0 6f 75 72 6e 61 6c 20 69 73 20 69 6e 20 75 73 65  ournal is in use
37df0 2c 20 74 68 65 6d 20 6d 61 6b 65 20 73 75 72 65  , them make sure
37e00 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 69   the page that i
37e10 73 20 61 62 6f 75 74 0a 20 20 2a 2a 20 74 6f 20  s about.  ** to 
37e20 63 68 61 6e 67 65 20 69 73 20 69 6e 20 74 68 65  change is in the
37e30 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
37e40 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 70 61 67  l, or if the pag
37e50 65 20 69 73 20 61 20 6e 65 77 20 70 61 67 65 20  e is a new page 
37e60 6f 66 66 0a 20 20 2a 2a 20 74 68 65 6e 20 65 6e  off.  ** then en
37e70 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 6d  d of the file, m
37e80 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6d  ake sure it is m
37e90 61 72 6b 65 64 20 61 73 20 50 47 48 44 52 5f 4e  arked as PGHDR_N
37ea0 45 45 44 5f 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20  EED_SYNC..  */. 
37eb0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
37ec0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29  ->pInJournal!=0)
37ed0 20 3d 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65   == isOpen(pPage
37ee0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
37ef0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37f00 6e 61 6c 21 3d 30 0a 20 20 20 26 26 20 73 71 6c  nal!=0.   && sql
37f10 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f  ite3BitvecTestNo
37f20 74 4e 75 6c 6c 28 70 50 61 67 65 72 2d 3e 70 49  tNull(pPager->pI
37f30 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
37f40 67 6e 6f 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  gno)==0.  ){.   
37f50 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
37f60 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
37f70 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
37f80 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
37f90 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
37fa0 20 20 72 63 20 3d 20 70 61 67 65 72 41 64 64 50    rc = pagerAddP
37fb0 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75  ageToRollbackJou
37fc0 72 6e 61 6c 28 70 50 67 29 3b 0a 20 20 20 20 20  rnal(pPg);.     
37fd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37fe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
37ff0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
38000 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
38010 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
38020 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54  tate!=PAGER_WRIT
38030 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20  ER_DBMOD ){.    
38040 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
38050 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
38060 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  C;.      }.     
38070 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50   PAGERTRACE(("AP
38080 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
38090 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
380a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
380b0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
380c0 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  Pg->pgno,.      
380d0 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
380e0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
380f0 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20  YNC)?1:0)));.   
38100 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
38110 20 50 47 48 44 52 5f 44 49 52 54 59 20 62 69 74   PGHDR_DIRTY bit
38120 20 69 73 20 73 65 74 20 61 62 6f 76 65 20 77 68   is set above wh
38130 65 6e 20 74 68 65 20 70 61 67 65 20 77 61 73 20  en the page was 
38140 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 69 72  added to the dir
38150 74 79 2d 6c 69 73 74 0a 20 20 2a 2a 20 61 6e 64  ty-list.  ** and
38160 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
38170 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
38180 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
38190 61 6c 2e 20 20 57 61 69 74 20 75 6e 74 69 6c 20  al.  Wait until 
381a0 6e 6f 77 2c 0a 20 20 2a 2a 20 61 66 74 65 72 20  now,.  ** after 
381b0 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
381c0 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6a  n successfully j
381d0 6f 75 72 6e 61 6c 6c 65 64 2c 20 62 65 66 6f 72  ournalled, befor
381e0 65 20 73 65 74 74 69 6e 67 20 74 68 65 0a 20 20  e setting the.  
381f0 2a 2a 20 50 47 48 44 52 5f 57 52 49 54 45 41 42  ** PGHDR_WRITEAB
38200 4c 45 20 62 69 74 20 74 68 61 74 20 69 6e 64 69  LE bit that indi
38210 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 70  cates that the p
38220 61 67 65 20 63 61 6e 20 62 65 20 73 61 66 65 6c  age can be safel
38230 79 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f  y modified..  */
38240 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d  .  pPg->flags |=
38250 20 50 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45   PGHDR_WRITEABLE
38260 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65  ;.  .  /* If the
38270 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
38280 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
38290 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
382a0 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  n it,.  ** then 
382b0 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 69  write the page i
382c0 6e 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e  nto the statemen
382d0 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
382e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 53    if( pPager->nS
382f0 61 76 65 70 6f 69 6e 74 3e 30 20 29 7b 0a 20 20  avepoint>0 ){.  
38300 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
38310 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28  lPageIfRequired(
38320 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pPg);.  }..  /* 
38330 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
38340 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
38350 75 72 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  urn. */.  if( pP
38360 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67  ager->dbSize<pPg
38370 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
38380 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
38390 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20  Pg->pgno;.  }.  
383a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
383b0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 61  .** This is a va
383c0 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33  riant of sqlite3
383d0 50 61 67 65 72 57 72 69 74 65 28 29 20 74 68 61  PagerWrite() tha
383e0 74 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20  t runs when the 
383f0 73 65 63 74 6f 72 20 73 69 7a 65 0a 2a 2a 20 69  sector size.** i
38400 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
38410 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 53 51  e page size.  SQ
38420 4c 69 74 65 20 6d 61 6b 65 73 20 74 68 65 20 28  Lite makes the (
38430 72 65 61 73 6f 6e 61 62 6c 65 29 20 61 73 73 75  reasonable) assu
38440 6d 70 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 61  mption that.** a
38450 6c 6c 20 62 79 74 65 73 20 6f 66 20 61 20 73 65  ll bytes of a se
38460 63 74 6f 72 20 61 72 65 20 77 72 69 74 74 65 6e  ctor are written
38470 20 74 6f 67 65 74 68 65 72 20 62 79 20 68 61 72   together by har
38480 64 77 61 72 65 2e 20 20 48 65 6e 63 65 2c 20 61  dware.  Hence, a
38490 6c 6c 20 62 79 74 65 73 20 6f 66 0a 2a 2a 20 61  ll bytes of.** a
384a0 20 73 65 63 74 6f 72 20 6e 65 65 64 20 74 6f 20   sector need to 
384b0 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 69 6e  be journalled in
384c0 20 63 61 73 65 20 6f 66 20 61 20 70 6f 77 65 72   case of a power
384d0 20 6c 6f 73 73 20 69 6e 20 74 68 65 20 6d 69 64   loss in the mid
384e0 64 6c 65 20 6f 66 0a 2a 2a 20 61 20 77 72 69 74  dle of.** a writ
384f0 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79  e..**.** Usually
38500 2c 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  , the sector siz
38510 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  e is less than o
38520 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70  r equal to the p
38530 61 67 65 20 73 69 7a 65 2c 20 69 6e 20 77 68 69  age size, in whi
38540 63 68 0a 2a 2a 20 63 61 73 65 20 70 61 67 65 73  ch.** case pages
38550 20 63 61 6e 20 62 65 20 69 6e 64 69 76 69 64 75   can be individu
38560 61 6c 6c 79 20 77 72 69 74 74 65 6e 2e 20 20 54  ally written.  T
38570 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
38580 20 72 75 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20   runs in the.** 
38590 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65  exceptional case
385a0 20 77 68 65 72 65 20 74 68 65 20 70 61 67 65 20   where the page 
385b0 73 69 7a 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  size is smaller 
385c0 74 68 61 6e 20 74 68 65 20 73 65 63 74 6f 72 20  than the sector 
385d0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
385e0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
385f0 69 6e 74 20 70 61 67 65 72 57 72 69 74 65 4c 61  int pagerWriteLa
38600 72 67 65 53 65 63 74 6f 72 28 50 67 48 64 72 20  rgeSector(PgHdr 
38610 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
38620 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
38630 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
38640 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  code */.  Pgno n
38650 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
38660 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
38670 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
38680 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
38690 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 31 3b 20   */.  Pgno pg1; 
386a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
386b0 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
386c0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sec