/ Hex Artifact Content
Login

Artifact d034c69b958c01289eb8070cbf902e1a68cd7e0b:


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 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6f 6e  ** If the option
4dc0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 44 55   SQLITE_EXTRA_DU
4dd0: 52 41 42 4c 45 20 6f 70 74 69 6f 6e 20 69 73 20  RABLE option is 
4de0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
4df0: 69 6d 65 2c 20 74 68 65 6e 0a 2a 2a 20 53 51 4c  ime, then.** SQL
4e00: 69 74 65 20 77 69 6c 6c 20 64 6f 20 65 78 74 72  ite will do extr
4e10: 61 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61 74  a fsync() operat
4e20: 69 6f 6e 73 20 77 68 65 6e 20 73 79 6e 63 68 72  ions when synchr
4e30: 6f 6e 6f 75 73 3d 3d 46 55 4c 4c 20 74 6f 20 68  onous==FULL to h
4e40: 65 6c 70 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68  elp.** ensure th
4e50: 61 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  at transactions 
4e60: 61 72 65 20 64 75 72 61 62 6c 65 20 61 63 72 6f  are durable acro
4e70: 73 73 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ss a power failu
4e80: 72 65 2e 20 20 4d 6f 73 74 0a 2a 2a 20 61 70 70  re.  Most.** app
4e90: 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 20 68 61  lications are ha
4ea0: 70 70 79 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ppy as long as t
4eb0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
4ec0: 63 6f 6e 73 69 73 74 65 6e 74 20 61 63 72 6f 73  consistent acros
4ed0: 73 0a 2a 2a 20 61 20 70 6f 77 65 72 20 66 61 69  s.** a power fai
4ee0: 6c 75 72 65 2c 20 61 6e 64 20 61 72 65 20 70 65  lure, and are pe
4ef0: 72 66 65 63 74 6c 79 20 77 69 6c 6c 69 6e 67 20  rfectly willing 
4f00: 74 6f 20 6c 6f 73 65 20 74 68 65 20 6c 61 73 74  to lose the last
4f10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
4f20: 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
4f30: 74 68 65 20 65 78 74 72 61 20 70 65 72 66 6f 72  the extra perfor
4f40: 6d 61 6e 63 65 20 6f 66 20 61 76 6f 69 64 69 6e  mance of avoidin
4f50: 67 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  g directory sync
4f60: 73 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 74 68 65  s..** And so the
4f70: 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f   default SQLITE_
4f80: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 20 73 65  EXTRA_DURABLE se
4f90: 74 74 69 6e 67 20 69 73 20 6f 66 66 2e 0a 2a 2f  tting is off..*/
4fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4fb0: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 0a 23 20  EXTRA_DURABLE.# 
4fc0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 58  define SQLITE_EX
4fd0: 54 52 41 5f 44 55 52 41 42 4c 45 20 30 0a 23 65  TRA_DURABLE 0.#e
4fe0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ndif.../*.** An 
4ff0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5000: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5010: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
5020: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
5030: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
5040: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
5050: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
5060: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
5070: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
5080: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
5090: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
50a0: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
50b0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
50c0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
50d0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
50e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
50f0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
5100: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
5110: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
5120: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
5130: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
5140: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
5150: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
5160: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
5170: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
5180: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
5190: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
51a0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
51b0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
51c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
51d0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
51e0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
51f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
5200: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
5210: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
5220: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
5230: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
5240: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
5250: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
5260: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
5270: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
5280: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
5290: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
52a0: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
52b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
52c0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
52f0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
5300: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
5310: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5320: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
5330: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
5340: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
5350: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
5360: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
5370: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
5380: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
5390: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
53a0: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
53b0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
53c0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
53e0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
53f0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
5400: 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
5410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
5420: 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b  .  u32 aWalData[
5430: 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44  WAL_SAVEPOINT_ND
5440: 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  ATA];        /* 
5450: 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f  WAL savepoint co
5460: 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntext */.#endif.
5470: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20 6f  };../*.** Bits o
5480: 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e 6f  f the Pager.doNo
5490: 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53 65  tSpill flag.  Se
54a0: 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72 69  e further descri
54b0: 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  ption below..*/.
54c0: 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41  #define SPILLFLA
54d0: 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30 78  G_OFF         0x
54e0: 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69 6c  01 /* Never spil
54f0: 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76 69  l cache.  Set vi
5500: 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65 66  a pragma */.#def
5510: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  ine SPILLFLAG_RO
5520: 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20 2f  LLBACK    0x02 /
5530: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5540: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5550: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5560: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5570: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f 2a  YNC      0x04 /*
5580: 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62 75   Spill is ok, bu
5590: 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a 2f  t do not sync */
55a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e 20  ../*.** An open 
55b0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
55c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
55d0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
55e0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
55f0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
5600: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
5610: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
5620: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5630: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5640: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5650: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5660: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5670: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5680: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5690: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
56a0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
56b0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
56c0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
56d0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
56e0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
56f0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
5700: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5710: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
5720: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5730: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5740: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5750: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5760: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5770: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5780: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5790: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
57a0: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
57b0: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
57c0: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
57d0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
57e0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
57f0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
5800: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
5810: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
5820: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5830: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5840: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5850: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5860: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5870: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5880: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5890: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
58a0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
58b0: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
58c0: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
58d0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
58e0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
58f0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
5900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
5910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
5920: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5930: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5940: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5950: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5960: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5970: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5980: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5990: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
59a0: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
59b0: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
59c0: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
59d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
59e0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
59f0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
5a00: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
5a10: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
5a20: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5a30: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5a40: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5a50: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5a60: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5a70: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5a80: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5a90: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5aa0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5ab0: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5ac0: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
5ad0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
5ae0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
5af0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
5b00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5b10: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
5b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5b30: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5b40: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5b50: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5b60: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5b70: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5b80: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5b90: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5ba0: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5bb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5bc0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
5bd0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
5be0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
5bf0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
5c00: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
5c10: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
5c20: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5c30: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5c40: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5c50: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5c60: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5c70: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5c80: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5c90: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5ca0: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5cb0: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5cc0: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5cd0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ce0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5cf0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5d00: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5d10: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5d20: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5d30: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5d40: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5d50: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5d70: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5d90: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5da0: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5db0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5dc0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5dd0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5de0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5df0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5e00: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5e10: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5e20: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5e30: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5e40: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5e50: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5e60: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5e70: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5e80: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5e90: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5ea0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5eb0: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5ec0: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ed0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5ee0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5ef0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5f00: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5f10: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5f20: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5f30: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5f40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5f50: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5f60: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5f70: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5f80: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5f90: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5fa0: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5fb0: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5fc0: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5fd0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5fe0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5ff0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
6000: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
6010: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
6020: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
6030: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
6040: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
6050: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
6060: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
6070: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
6080: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
6090: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
60a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
60b0: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
60c0: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
60d0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
60e0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
60f0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
6100: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
6110: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
6120: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
6130: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
6140: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
6150: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
6160: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
6170: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
6180: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
6190: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
61a0: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
61b0: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
61c0: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
61d0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
61e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
61f0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
6200: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
6210: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
6220: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6230: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6240: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6250: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6260: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6270: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6280: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6290: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
62a0: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
62b0: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
62c0: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
62d0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
62e0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
62f0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
6300: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6310: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6320: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6330: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6340: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6350: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6360: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6370: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6380: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6390: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
63a0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
63b0: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
63c0: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
63d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
63e0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
63f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6400: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
6410: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
6420: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6430: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6440: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6450: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6460: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6470: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6480: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6490: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
64a0: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
64b0: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
64c0: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a  e database from.
64d0: 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73 73  **   pagerStress
64e0: 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c  () is permitted,
64f0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
6500: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
6510: 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20   not..**   This 
6520: 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 73  flag is set by s
6530: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6540: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6550: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6560: 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72 67  ize.**   is larg
6570: 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
6580: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6590: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
65a0: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
65b0: 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70 70  c.**   from happ
65c0: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
65d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
65e0: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
65f0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
6600: 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d  . .**.** subjInM
6610: 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68  emory.**.**   Th
6620: 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20  is is a boolean 
6630: 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75  variable. If tru
6640: 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  e, then any requ
6650: 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  ired sub-journal
6660: 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20  .**   is opened 
6670: 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
6680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6690: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d   false, then in-
66a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d  memory.**   sub-
66b0: 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c  journals are onl
66c0: 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  y used for in-me
66d0: 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  mory pager files
66e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76  ..**.**   This v
66f0: 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61 74  ariable is updat
6700: 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72 20  ed by the upper 
6710: 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65 20  layer each time 
6720: 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69 74  a new .**   writ
6730: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6740: 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 64   opened..**.** d
6750: 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a  bSize, dbOrigSiz
6760: 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  e, dbFileSize.**
6770: 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20 64  .**   Variable d
6780: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6790: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
67a0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
67b0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
67c0: 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50 41  t is valid in PA
67d0: 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20 68  GER_READER and h
67e0: 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61 6c  igher states (al
67f0: 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74 20  l states except 
6800: 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61 6e  for.**   OPEN an
6810: 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a 2a  d ERROR). .**.**
6820: 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65 74     dbSize is set
6830: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
6840: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
6850: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
6860: 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72 67  ay be .**   larg
6870: 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65  er than the size
6880: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
6890: 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72   (the value stor
68a0: 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ed at offset.** 
68b0: 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74 61    28 of the data
68c0: 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20 74  base header by t
68d0: 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74 68  he btree). If th
68e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
68f0: 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61  le.**   is not a
6900: 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
6910: 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
6920: 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20 73  ize, the value s
6930: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64 62  tored in.**   db
6940: 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64 20  Size is rounded 
6950: 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b 42  down (i.e. a 5KB
6960: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6970: 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53 69  ge-size has dbSi
6980: 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78 63  ze==2)..**   Exc
6990: 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74 68  ept, any file th
69a0: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
69b0: 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
69c0: 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
69d0: 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61 74  .**   to have at
69e0: 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e   least one page.
69f0: 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69 6c   (i.e. a 1KB fil
6a00: 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d 73  e with 2K page-s
6a10: 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20 74  ize leads.**   t
6a20: 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a 2a  o dbSize==1)..**
6a30: 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20 77  .**   During a w
6a40: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a50: 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68 20  , if pages with 
6a60: 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72 65  page-numbers gre
6a70: 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 64  ater than.**   d
6a80: 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66 69  bSize are modifi
6a90: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
6aa0: 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74   dbSize is updat
6ab0: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ed accordingly..
6ac0: 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c 20  **   Similarly, 
6ad0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
6ae0: 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73 69  is truncated usi
6af0: 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74 65  ng PagerTruncate
6b00: 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20 64  Image(), .**   d
6b10: 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65 64  bSize is updated
6b20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  ..**.**   Variab
6b30: 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20 61  les dbOrigSize a
6b40: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61 72  nd dbFileSize ar
6b50: 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74 65  e valid in state
6b60: 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57 52  s .**   PAGER_WR
6b70: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  ITER_LOCKED and 
6b80: 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53 69  higher. dbOrigSi
6b90: 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ze is a copy of 
6ba0: 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20 20  the dbSize.**   
6bb0: 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65 20  variable at the 
6bc0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
6bd0: 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
6be0: 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c 6c  used during roll
6bf0: 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20 74  back,.**   and t
6c00: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
6c10: 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65 73  her or not pages
6c20: 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
6c30: 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a 2a  nalled before.**
6c40: 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65     being modifie
6c50: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f 75  d..**.**   Throu
6c60: 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74 72  ghout a write-tr
6c70: 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69 6c  ansaction, dbFil
6c80: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
6c90: 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20 20  he size of.**   
6ca0: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
6cb0: 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69 73   in pages. It is
6cc0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6cd0: 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74 68  f dbSize when th
6ce0: 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61  e.**   write-tra
6cf0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72 73  nsaction is firs
6d00: 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75 70  t opened, and up
6d10: 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20 63  dated when VFS c
6d20: 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a  alls are made.**
6d30: 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20 74     to write or t
6d40: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
6d50: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
6d60: 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  k. .**.**   The 
6d70: 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65 20  only reason the 
6d80: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
6d90: 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ble is required 
6da0: 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20 0a  is to suppress .
6db0: 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72 79  **   unnecessary
6dc0: 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e 63   calls to xTrunc
6dd0: 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d 6d  ate() after comm
6de0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
6df0: 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20 20  tion. If, .**   
6e00: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
6e10: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
6e20: 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20   the dbFileSize 
6e30: 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61 74  variable indicat
6e40: 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74 68  es .**   that th
6e50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6e60: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6e70: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
6e80: 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65 29  e (Pager.dbSize)
6e90: 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  , .**   pager_tr
6ea0: 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c 6c  uncate() is call
6eb0: 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74 72  ed. The pager_tr
6ec0: 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
6ed0: 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a 2a  es xFilesize().*
6ee0: 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20 74  *   to measure t
6ef0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6f00: 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74 68   on disk, and th
6f10: 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74 20  en truncates it 
6f20: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  if required..** 
6f30: 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73 20    dbFileSize is 
6f40: 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72 6f  not used when ro
6f50: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
6f60: 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
6f70: 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67 65  s case.**   page
6f80: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6f90: 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74 69  called unconditi
6fa0: 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d 65  onally (which me
6fb0: 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62 65  ans there may be
6fc0: 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f 20  .**   a call to 
6fd0: 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61 74  xFilesize() that
6fe0: 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c 79   is not strictly
6ff0: 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20 65   required). In e
7000: 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20 20  ither case,.**  
7010: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
7020: 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  ) may cause the 
7030: 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20 73  file to become s
7040: 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65 72  maller or larger
7050: 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53 69  ..**.** dbHintSi
7060: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ze.**.**   The d
7070: 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61 62  bHintSize variab
7080: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c 69  le is used to li
7090: 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  mit the number o
70a0: 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f 0a  f calls made to.
70b0: 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46 69  **   the VFS xFi
70c0: 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f  leControl(FCNTL_
70d0: 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f  SIZE_HINT) metho
70e0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48 69  d. .**.**   dbHi
70f0: 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  ntSize is set to
7100: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64   a copy of the d
7110: 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 77  bSize variable w
7120: 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74 65  hen a.**   write
7130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
7140: 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20 73  opened (at the s
7150: 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46 69  ame time as dbFi
7160: 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20 20  leSize and.**   
7170: 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66 20  dbOrigSize). If 
7180: 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
7190: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
71a0: 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  ) method is call
71b0: 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74 53  ed,.**   dbHintS
71c0: 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  ize is increased
71d0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
71e0: 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f 72  f pages that cor
71f0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a 2a  respond to the.*
7200: 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70 61  *   size-hint pa
7210: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74 68  ssed to the meth
7220: 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61 67  od call. See pag
7230: 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
7240: 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64 65  t() for .**   de
7250: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  tails..**.** err
7260: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  Code.**.**   The
7270: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
7280: 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20  ariable is only 
7290: 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41 47  ever used in PAG
72a0: 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
72b0: 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  It.**   is set t
72c0: 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f 74  o zero in all ot
72d0: 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20 50  her states. In P
72e0: 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
72f0: 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  , Pager.errCode 
7300: 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73 20  .**   is always 
7310: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55  set to SQLITE_FU
7320: 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
7330: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 53   or one of the S
7340: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
7350: 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73 2e  .**   sub-codes.
7360: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
7370: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
7380: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
7390: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
73a0: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
73b0: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
73c0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
73d0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
73e0: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
73f0: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
7400: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7420: 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52  One of the PAGER
7430: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
7440: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
7450: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
7460: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
7470: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
7480: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
7490: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74b0: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
74c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
74d0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
74e0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
74f0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
7500: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
7510: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
7520: 73 73 20 2a 2f 0a 20 20 75 38 20 65 78 74 72 61  ss */.  u8 extra
7530: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
7540: 20 20 20 20 2f 2a 20 73 79 6e 63 20 64 69 72 65      /* sync dire
7550: 63 74 6f 72 79 20 61 66 74 65 72 20 6a 6f 75 72  ctory after jour
7560: 6e 61 6c 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  nal delete */.  
7570: 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  u8 ckptSyncFlags
7580: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7590: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
75a0: 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63  NC_FULL for chec
75b0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77  kpoint */.  u8 w
75c0: 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  alSyncFlags;    
75d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
75e0: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
75f0: 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74  ULL for wal writ
7600: 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46  es */.  u8 syncF
7610: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7620: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7630: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7640: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
7650: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
7660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
7670: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
7680: 70 6f 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61  porary or immuta
7690: 62 6c 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ble file */.  u8
76a0: 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
76b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76c0: 6e 6f 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74  not lock (except
76d0: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f   in WAL mode) */
76e0: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7700: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
7710: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
7720: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
7750: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
7760: 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a   */..  /********
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  **.  ** The foll
77c0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
77d0: 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73  ains those class
77e0: 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63 68   members that ch
77f0: 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a  ange during.  **
7800: 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69   routine operati
7810: 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65  on.  Class membe
7820: 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62  rs not in this b
7830: 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65 72 20  lock are either 
7840: 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20  fixed.  ** when 
7850: 74 68 65 20 70 61 67 65 72 20 69 73 20 66 69 72  the pager is fir
7860: 73 74 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c  st created or el
7870: 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77  se only change w
7880: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20  hen there is a. 
7890: 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20   ** significant 
78a0: 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73 75 63  mode change (suc
78b0: 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68  h as changing th
78c0: 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63  e page_size, loc
78d0: 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20  king_mode,.  ** 
78e0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d  or the journal_m
78f0: 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74  ode).  From anot
7900: 68 65 72 20 76 69 65 77 2c 20 74 68 65 73 65 20  her view, these 
7910: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
7920: 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20  scribe.  ** the 
7930: 22 73 74 61 74 65 22 20 6f 66 20 74 68 65 20 70  "state" of the p
7940: 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65  ager, while othe
7950: 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  r class members 
7960: 64 65 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a  describe the.  *
7970: 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  * "configuration
7980: 22 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a  " of the pager..
7990: 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65    */.  u8 eState
79a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74     /* Pager stat
79c0: 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c  e (OPEN, READER,
79d0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e   WRITER_LOCKED..
79e0: 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b  ) */.  u8 eLock;
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f     /* Current lo
7a10: 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62  ck held on datab
7a20: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
7a30: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
7a40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
7a50: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
7a60: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
7a70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
7a80: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
7a90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7aa0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
7ab0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
7ac0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
7ad0: 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20  oNotSpill;      
7ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7af0: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
7b00: 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  e when non-zero 
7b10: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
7b20: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
7b30: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7b40: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
7b50: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62  urnals */.  u8 b
7b60: 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20 20  UseFetch;       
7b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7b80: 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29 20  to use xFetch() 
7b90: 2a 2f 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53  */.  u8 hasHeldS
7ba0: 68 61 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20  haredLock;      
7bb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 73 68   /* True if a sh
7bc0: 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76  ared lock has ev
7bd0: 65 72 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a  er been held */.
7be0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c00: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
7c10: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7c20: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
7c30: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
7c40: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7c50: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7c60: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7c70: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7c90: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7ca0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7cb0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
7cc0: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
7cd0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
7ce0: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
7cf0: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
7d00: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d20: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
7d30: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
7d40: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7d70: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7d80: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
7d90: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
7da0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
7db0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
7dc0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
7dd0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
7de0: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7df0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7e10: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7e20: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7e30: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7e40: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7e50: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7e60: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7e70: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7e80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7e90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7ea0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7eb0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
7ec0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ed0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
7ee0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ef0: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7f00: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7f10: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7f20: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7f30: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7f40: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7f50: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7f60: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7f70: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7f80: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7f90: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7fa0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7fb0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7fc0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7fd0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7ff0: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
8000: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
8010: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
8020: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
8030: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
8040: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
8050: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
8060: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
8070: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
8080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8090: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
80a0: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
80b0: 74 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61  t[] */.  u32 iDa
80c0: 74 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20  taVersion;      
80d0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
80e0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
80f0: 65 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65  e content change
8100: 73 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  s */.  char dbFi
8110: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
8120: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
8130: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
8140: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
8150: 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b  .  int nMmapOut;
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70  * Number of mmap
8180: 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
8190: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a   outstanding */.
81a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
81b0: 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  szMmap;       /*
81c0: 20 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d   Desired maximum
81d0: 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20   mmap size */.  
81e0: 50 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65  PgHdr *pMmapFree
81f0: 6c 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  list;       /* L
8200: 69 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70  ist of free mmap
8210: 20 70 61 67 65 20 68 65 61 64 65 72 73 20 28 70   page headers (p
8220: 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20  Dirty) */.  /*. 
8230: 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72   ** End of the r
8240: 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e  outinely-changin
8250: 67 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a  g class members.
8260: 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    **************
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
82b0: 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20    u16 nExtra;   
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82d0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
82e0: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
82f0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
8300: 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20   i16 nReserve;  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8320: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
8330: 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66   bytes at end of
8340: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
8350: 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20  u32 vfsFlags;   
8360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8370: 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
8380: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
8390: 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65    u32 sectorSize
83a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
83b0: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
83c0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
83d0: 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61  back */.  int pa
83e0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
83f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8400: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
8410: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
8420: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
8430: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
8440: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
8450: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
8460: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
8470: 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
8480: 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70  Size limit for p
8490: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
84a0: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61  l files */.  cha
84b0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
84c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
84d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
84e0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
84f0: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
8500: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8510: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
8520: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  le */.  int (*xB
8530: 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
8540: 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  *); /* Function 
8550: 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73  to call when bus
8560: 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  y */.  void *pBu
8570: 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20  syHandlerArg;   
8580: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72     /* Context ar
8590: 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79  gument for xBusy
85a0: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74  Handler */.  int
85b0: 20 61 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20   aStat[3];      
85c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
85d0: 6c 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69  l cache hits, mi
85e0: 73 73 65 73 20 61 6e 64 20 77 72 69 74 65 73 20  sses and writes 
85f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8600: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61  _TEST.  int nRea
8610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8620: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8630: 70 61 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65  pages read */.#e
8640: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52  ndif.  void (*xR
8650: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
8660: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
8670: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
8680: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
8690: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
86a0: 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a  S_CODEC.  void *
86b0: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
86c0: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
86d0: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
86e0: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
86f0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
8700: 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
8710: 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20  d*,int,int); /* 
8720: 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73  Notify of page s
8730: 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ize changes */. 
8740: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
8750: 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  ee)(void*);     
8760: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
8770: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f  uctor for the co
8780: 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  dec */.  void *p
8790: 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20  Codec;          
87a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
87b0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
87c0: 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  ... methods */.#
87d0: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
87e0: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
87f0: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
8800: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
8810: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
8820: 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50   */.  PCache *pP
8830: 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20  Cache;          
8840: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8850: 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63  page cache objec
8860: 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  t */.#ifndef SQL
8870: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57  ITE_OMIT_WAL.  W
8880: 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20  al *pWal;       
8890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
88a0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73  ite-ahead log us
88b0: 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ed by "journal_m
88c0: 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68  ode=wal" */.  ch
88d0: 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20  ar *zWal;       
88e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
88f0: 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65  e name for write
8900: 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65  -ahead log */.#e
8910: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ndif.};../*.** I
8920: 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20 77  ndexes for use w
8930: 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b  ith Pager.aStat[
8940: 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53 74  ]. The Pager.aSt
8950: 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  at[] array conta
8960: 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ins.** the value
8970: 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61  s accessed by pa
8980: 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53  ssing SQLITE_DBS
8990: 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c  TATUS_CACHE_HIT,
89a0: 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20   CACHE_MISS .** 
89b0: 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20 74  or CACHE_WRITE t
89c0: 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61  o sqlite3_db_sta
89d0: 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tus()..*/.#defin
89e0: 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  e PAGER_STAT_HIT
89f0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
8a00: 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a  ER_STAT_MISS  1.
8a10: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a20: 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a  AT_WRITE 2../*.*
8a30: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8a40: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8a50: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
8a60: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
8a70: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
8a80: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8a90: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8aa0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8ab0: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8ac0: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
8ad0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
8ae0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
8af0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
8b00: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
8b10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8b20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8b30: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8b40: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8b50: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
8b60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
8b70: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8b80: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8b90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8ba0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8bb0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8bc0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
8bd0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
8be0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
8bf0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
8c00: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
8c10: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
8c20: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8c30: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8c40: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8c50: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
8c60: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
8c70: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
8c80: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8c90: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8ca0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8cb0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8cc0: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
8cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
8ce0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
8cf0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
8d00: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8d10: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
8d20: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8d40: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8d50: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
8d60: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
8d70: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
8d80: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8d90: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8da0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8db0: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8dc0: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
8dd0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
8de0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
8df0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
8e00: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
8e10: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
8e20: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8e30: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8e40: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8e50: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8e60: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8e70: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
8e80: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8e90: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8ea0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8eb0: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8ec0: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
8ed0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
8ee0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
8ef0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
8f00: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
8f10: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
8f20: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8f30: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8f40: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8f50: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
8f60: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
8f70: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
8f80: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8f90: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8fa0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8fb0: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8fc0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
8fd0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
8fe0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
8ff0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
9000: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
9010: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
9020: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
9030: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
9040: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
9050: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
9060: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
9070: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
9080: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
9090: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
90a0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
90b0: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
90c0: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
90d0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
90e0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
90f0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
9100: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
9110: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
9120: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
9130: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
9140: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
9150: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
9160: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
9170: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
9180: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
9190: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
91a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
91b0: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
91c0: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
91d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
91e0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
91f0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
9200: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9210: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
9220: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
9230: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
9240: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
9250: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
9260: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
9270: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
9280: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
9290: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
92a0: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
92b0: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
92c0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
92d0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
92e0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
92f0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
9300: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
9310: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
9320: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
9330: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
9340: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
9350: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
9360: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
9370: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
9380: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
9390: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
93a0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
93b0: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
93c0: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
93d0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
93e0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
93f0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
9400: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
9410: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
9420: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
9430: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
9440: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
9450: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9460: 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48 20   macro USEFETCH 
9470: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
9480: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65  e allowed to use
9490: 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64 20   the xFetch and 
94a0: 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65  xUnfetch.** inte
94b0: 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73 73  rfaces to access
94c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
94d0: 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65  ing memory-mappe
94e0: 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51  d I/O..*/.#if SQ
94f0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
9500: 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53  ZE>0.# define US
9510: 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e  EFETCH(x) ((x)->
9520: 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65  bUseFetch).#else
9530: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9540: 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a  CH(x) 0.#endif..
9550: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
9560: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
9570: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
9580: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
9590: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
95a0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
95b0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
95c0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
95d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
95e0: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
95f0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
9600: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
9610: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
9620: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
9630: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
9640: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
9650: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
9660: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
9670: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
9680: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
9690: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
96a0: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
96b0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
96c0: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
96d0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
96e0: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
96f0: 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52  ods!=0)../*.** R
9700: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9710: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9720: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9730: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9740: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
9750: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
9760: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
9770: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9780: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
9790: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
97a0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
97b0: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
97c0: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
97d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
97e0: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
97f0: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
9800: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9810: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9820: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9830: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9840: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9850: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9860: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9870: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9880: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9890: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
98a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
98b0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
98c0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
98d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
98e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
98f0: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
9900: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9910: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9920: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9930: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9940: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9950: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9960: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9970: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9980: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9990: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
99a0: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
99b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
99c0: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
99d0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
99e0: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
99f0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9a00: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9a10: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9a20: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9a30: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9a40: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9a50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9a60: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9a70: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9a80: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9a90: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9aa0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9ab0: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
9ac0: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
9ad0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
9ae0: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
9af0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
9b00: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9b10: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9b20: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9b30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9b40: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9b50: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9b60: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9b70: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9b80: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9b90: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9ba0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9bb0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9bc0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9bd0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
9be0: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9bf0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9c00: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9c10: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9c20: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9c30: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9c40: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9c50: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9c60: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9c70: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9c80: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
9c90: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
9ca0: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
9cb0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9cc0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9cd0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
9ce0: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
9cf0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9d00: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9d10: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9d20: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9d30: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9d40: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
9d50: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
9d60: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
9d70: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
9d80: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
9d90: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
9da0: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9db0: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9dc0: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9dd0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9de0: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9df0: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9e00: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9e10: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9e20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9e30: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9e40: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
9e50: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
9e60: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9e70: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
9e80: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9e90: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
9ea0: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9eb0: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9ec0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9ed0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9ee0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9ef0: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9f00: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9f10: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9f20: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9f30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9f40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9f50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9f60: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
9f70: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9f80: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9f90: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
9fa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9fb0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9fc0: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9fd0: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9fe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9ff0: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
a000: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
a010: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
a020: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
a030: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
a040: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
a050: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
a060: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
a070: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
a080: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
a090: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
a0a0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
a0b0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a0c0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
a0d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
a0e0: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
a0f0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
a100: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
a110: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
a120: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a130: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a140: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a150: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
a160: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
a170: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
a180: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
a190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a1a0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
a1b0: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
a1c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a1d0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a1e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1f0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a200: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a210: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a220: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
a230: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a240: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a250: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
a260: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a270: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
a280: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a290: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a2a0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a2b0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
a2c0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a2d0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a2e0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a2f0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a300: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a310: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
a320: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
a330: 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  igSize );.      
a340: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a350: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a360: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a370: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a380: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a390: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a3a0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a3b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a3c0: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
a3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a3e0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a3f0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
a400: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a410: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a420: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a430: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a440: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a450: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
a460: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a470: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
a480: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
a490: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
a4a0: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
a4b0: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
a4c0: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
a4d0: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
a4e0: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
a4f0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
a500: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
a510: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
a520: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
a530: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
a540: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
a550: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
a560: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
a570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
a580: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a590: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a5a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a5b0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a5d0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a5e0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a5f0: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a600: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a610: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a620: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a630: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a640: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a650: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a660: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a670: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a680: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a690: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a6a0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a6b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a6c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a6d0: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a6e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a6f0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a700: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a710: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a720: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a730: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a740: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a750: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a760: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a770: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a780: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a790: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a7a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a7b0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a7c0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a7d0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a7e0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a7f0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a800: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a810: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a820: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a830: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a840: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a850: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a860: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a870: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a880: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a890: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a8a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a8b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a8c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a8d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a8e0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a8f0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a900: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a910: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a920: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a930: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a940: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a950: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a960: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a970: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a980: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
a990: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a9a0: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
a9b0: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
a9c0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
a9d0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
a9e0: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
a9f0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
aa00: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
aa10: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
aa20: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
aa30: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
aa40: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
aa50: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
aa60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
aa70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
aa80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
aa90: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
aaa0: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
aab0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
aac0: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
aad0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
aae0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
aaf0: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
ab00: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
ab10: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
ab20: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
ab30: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
ab40: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
ab50: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
ab60: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
ab70: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
ab80: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
ab90: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
aba0: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
abb0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
abc0: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
abd0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
abe0: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
abf0: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
ac00: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
ac10: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
ac20: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
ac30: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
ac40: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
ac50: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
ac60: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
ac70: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
ac80: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
ac90: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
aca0: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
acb0: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
acc0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
acd0: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
ace0: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
acf0: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
ad00: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
ad10: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
ad20: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
ad30: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ad40: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
ad50: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ad60: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
ad70: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
ad80: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
ad90: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
ada0: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
adb0: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
adc0: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
add0: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
ade0: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
adf0: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
ae00: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
ae10: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
ae20: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
ae30: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
ae40: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
ae50: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
ae60: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ae70: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
ae80: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
ae90: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aea0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
aeb0: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
aec0: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
aed0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
aee0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
aef0: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
af00: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
af10: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
af20: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
af30: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
af40: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
af50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
af60: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
af70: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
af80: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
af90: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
afa0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
afb0: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
afc0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
afd0: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
afe0: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
aff0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
b000: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
b010: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
b020: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
b030: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
b040: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
b050: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
b060: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
b070: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b080: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
b090: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
b0a0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b0b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
b0c0: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
b0d0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b0e0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
b0f0: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
b100: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
b110: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
b120: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b130: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
b140: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
b150: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b160: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b170: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
b180: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
b190: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1a0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1b0: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
b1c0: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
b1d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1f0: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
b200: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
b210: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b220: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b230: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
b240: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
b250: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b260: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b270: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
b280: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
b290: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b2a0: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
b2b0: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
b2c0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
b2d0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
b2e0: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
b2f0: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
b300: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b310: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b320: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b330: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b340: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b360: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
b370: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
b380: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
b390: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
b3a0: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
b3b0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b3c0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b3d0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
b3e0: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
b3f0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
b400: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
b410: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
b420: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
b430: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
b440: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
b450: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
b460: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
b470: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
b480: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
b490: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
b4a0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
b4b0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
b4d0: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
b4e0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b4f0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b500: 67 65 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65  ger;.  PagerSave
b510: 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f  point *p;.  Pgno
b520: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
b530: 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  o;.  int i;.  fo
b540: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b550: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b560: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67  ){.    p = &pPag
b570: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
b580: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
b590: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
b5a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b5b0: 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53  tNotNull(p->pInS
b5c0: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20  avepoint, pgno) 
b5d0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b5e0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
b5f0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
b600: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b610: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b620: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
b630: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
b640: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
b650: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b660: 49 6e 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  InJournal(Pager 
b670: 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
b680: 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  pPg){.  return s
b690: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
b6a0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
b6b0: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
b6c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b6d0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
b6e0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
b6f0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
b700: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
b710: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
b720: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
b730: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
b740: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
b750: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
b760: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
b770: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b780: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
b790: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
b7a0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
b7b0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
b7c0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
b7d0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b7e0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b7f0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
b800: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
b810: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
b820: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
b830: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
b840: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
b850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b860: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
b870: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
b880: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
b890: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
b8a0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b8b0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
b8c0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
b8d0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
b8e0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
b8f0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
b900: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
b910: 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a  u8*)A,B).../*.**
b920: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b930: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
b940: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
b950: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
b960: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
b970: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
b980: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b990: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b9a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b9b0: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
b9c0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b9d0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
b9e0: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
b9f0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
ba00: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
ba10: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ba20: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
ba30: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  t);.}../*.** Unl
ba40: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
ba50: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
ba60: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
ba70: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
ba80: 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f  CK.** or SHARED_
ba90: 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73  LOCK. Regardless
baa0: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
bab0: 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  ot the call to x
bac0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63  Unlock().** succ
bad0: 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61  eeds, set the Pa
bae0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
baf0: 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  le to match the 
bb00: 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20  (attempted) new 
bb10: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  lock..**.** Exce
bb20: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
bb30: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
bb40: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
bb50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
bb60: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bb70: 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65  t modify it. See
bb80: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
bb90: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
bba0: 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  f .** UNKNOWN_LO
bbb0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
bbc0: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a  ation of this..*
bbd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
bbe0: 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72  erUnlockDb(Pager
bbf0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
bc00: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
bc10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
bc20: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
bc30: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
bc40: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
bc50: 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72  eLock );.  asser
bc60: 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  t( eLock==NO_LOC
bc70: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  K || eLock==SHAR
bc80: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
bc90: 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  ert( eLock!=NO_L
bca0: 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57  OCK || pagerUseW
bcb0: 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
bcc0: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
bcd0: 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
bce0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bcf0: 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b  >eLock>=eLock );
bd00: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
bd10: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
bd20: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
bd30: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
bd40: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
bd50: 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
bd60: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
bd70: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
bd80: 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63  eLock = (u8)eLoc
bd90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  k;.    }.    IOT
bda0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
bdb0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
bdc0: 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65  eLock)).  }.  re
bdd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bde0: 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  * Lock the datab
bdf0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
be00: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
be10: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48  ust be either SH
be20: 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45  ARED_LOCK,.** RE
be30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
be40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49  XCLUSIVE_LOCK. I
be50: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
be60: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
be70: 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  the.** Pager.eLo
be80: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
be90: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
bea0: 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63  tate. .**.** Exc
beb0: 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c  ept, if Pager.eL
bec0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
bed0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20  KNOWN_LOCK when 
bee0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
bef0: 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20   .** called, do 
bf00: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e  not modify it un
bf10: 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63  less the new loc
bf20: 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58  king state is EX
bf30: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a  CLUSIVE_LOCK. .*
bf40: 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  * See the commen
bf50: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
bf60: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
bf70: 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
bf80: 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68  nation .** of th
bf90: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
bfa0: 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61  t pagerLockDb(Pa
bfb0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
bfc0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
bfd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
bfe0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
bff0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c000: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
c010: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45  LOCK || eLock==E
c020: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
c030: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
c040: 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50  Lock<eLock || pP
c050: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
c060: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
c070: 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f   rc = pPager->no
c080: 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Lock ? SQLITE_OK
c090: 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   : sqlite3OsLock
c0a0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
c0b0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
c0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
c0d0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
c0e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
c0f0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c100: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
c110: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
c120: 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  eLock;.      IOT
c130: 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
c140: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
c150: 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock)).    }.  }.
c160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c180: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
c190: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
c1a0: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
c1b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
c1c0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
c1d0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
c1e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
c1f0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
c200: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
c210: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
c220: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
c230: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
c240: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
c250: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
c260: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
c270: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
c280: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
c290: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
c2a0: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
c2b0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
c2c0: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
c2d0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
c2e0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
c2f0: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
c300: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
c310: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
c320: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
c330: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
c340: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
c350: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
c360: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
c370: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
c380: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
c390: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
c3a0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
c3b0: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
c3c0: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
c3d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c3e0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c3f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c400: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
c410: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
c420: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
c430: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
c440: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
c450: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
c460: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
c470: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
c480: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
c490: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
c4a0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c4b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
c4e0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
c4f0: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
c500: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c520: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
c530: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
c560: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
c570: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c580: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
c590: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
c5a0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
c5b0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
c5c0: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
c5d0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
c5e0: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
c5f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
c600: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
c610: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
c620: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
c630: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c640: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
c650: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
c660: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
c670: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c680: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
c690: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
c6a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c6b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
c6c0: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
c6d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
c6e0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c6f0: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
c700: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
c710: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
c720: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
c730: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
c740: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
c750: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
c760: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
c770: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
c780: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
c790: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
c7a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
c7b0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
c7c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
c7d0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
c7e0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
c7f0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
c800: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
c810: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
c820: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
c830: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
c840: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
c850: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
c860: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
c870: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
c880: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
c890: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
c8a0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c8b0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
c8c0: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
c8d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c8e0: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
c8f0: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
c900: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
c910: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
c920: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
c930: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
c940: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
c950: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c960: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
c970: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
c980: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
c990: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
c9a0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
c9b0: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c9c0: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
c9d0: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
c9e0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
c9f0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
ca00: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
ca10: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
ca20: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
ca30: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
ca40: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
ca50: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
ca60: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
ca70: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
ca80: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
ca90: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
caa0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
cab0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
cac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
cad0: 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
cae0: 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
caf0: 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
cb00: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
cb10: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
cb20: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
cb30: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
cb40: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
cb50: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
cb60: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
cb70: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
cb80: 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61  ine pager_set_pa
cb90: 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e  gehash(X).#defin
cba0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
cbb0: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
cbc0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
cbd0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
cbe0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
cbf0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
cc00: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
cc10: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
cc20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
cc30: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
cc40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cc50: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
cc60: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
cc70: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
cc80: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
cc90: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
cca0: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
ccb0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
ccc0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
ccd0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
cce0: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
ccf0: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
cd00: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
cd10: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
cd20: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
cd30: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
cd40: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
cd50: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
cd60: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
cd70: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
cd80: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
cd90: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
cda0: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
cdb0: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
cdc0: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
cdd0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
cde0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
cdf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce00: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
ce10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
ce20: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
ce30: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
ce40: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
ce50: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
ce60: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
ce70: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
ce80: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
ce90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
cea0: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
ceb0: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
cec0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
ced0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cee0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
cef0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
cf00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
cf10: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
cf20: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
cf30: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
cf40: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
cf50: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
cf60: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
cf70: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
cf80: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
cf90: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
cfa0: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
cfb0: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
cfc0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
cfd0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cfe0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
cff0: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
d000: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
d010: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
d020: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
d030: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
d040: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
d050: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
d060: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
d070: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
d080: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
d090: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
d0a0: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
d0b0: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
d0c0: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
d0d0: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
d0e0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
d0f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
d100: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
d110: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
d120: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
d130: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
d140: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d150: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
d180: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
d190: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
d1a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d1c0: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
d1d0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
d1e0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
d210: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
d220: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d230: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
d240: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
d250: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
d260: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
d270: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
d280: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
d290: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
d2a0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
d2b0: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
d2c0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d2d0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
d2e0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
d2f0: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
d300: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
d310: 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20  | len==0 .   || 
d320: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d330: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
d340: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
d350: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
d360: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d370: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
d380: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
d390: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
d3a0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
d3b0: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
d3c0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d3d0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
d3e0: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
d3f0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
d400: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
d410: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
d420: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
d430: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
d440: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d450: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
d460: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
d470: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
d480: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
d490: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
d4a0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
d4b0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
d4c0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
d4d0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
d4e0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
d4f0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
d500: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
d510: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
d520: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d530: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d540: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d550: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d560: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d570: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d580: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d590: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d5a0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d5b0: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d5c0: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d5d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d5e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d5f0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d600: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d610: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d620: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d630: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d650: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d660: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d670: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d680: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d690: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d6a0: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d6b0: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
d6c0: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
d6d0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d700: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d730: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d740: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d750: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d760: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d770: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d790: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d7a0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d7b0: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d7c0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d7d0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d7e0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d7f0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d800: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d810: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d820: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d830: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d840: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d850: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d860: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d870: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d880: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d8a0: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d8b0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d8c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d8d0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d8e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d8f0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d900: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d910: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d920: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d930: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d940: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d950: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d960: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d970: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d980: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d990: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d9a0: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d9b0: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d9c0: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d9d0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d9e0: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d9f0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
da00: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
da10: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
da20: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
da30: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
da40: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
da50: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
da60: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
da70: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
da80: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
da90: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
daa0: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
dab0: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
dac0: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
dad0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
dae0: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
daf0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
db00: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
db10: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
db20: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
db30: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
db40: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
db50: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
db60: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
db70: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
db80: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
db90: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
dba0: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
dbb0: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
dbc0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
dbd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
dbe0: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
dbf0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
dc00: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
dc10: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
dc20: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
dc30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
dc40: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
dc50: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
dc60: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
dc70: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
dc80: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
dc90: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
dca0: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
dcb0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
dcc0: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
dcd0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
dce0: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
dcf0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
dd00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
dd30: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
dd40: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
dd50: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
dd60: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
dd70: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
dd80: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
dd90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
dda0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
ddb0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
ddc0: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
ddd0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
dde0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
ddf0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
de00: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
de10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
de20: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
de30: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
de40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
de50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
de60: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
de70: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
de80: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
de90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
dea0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
deb0: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
dec0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ded0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
dee0: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
def0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
df00: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
df10: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
df20: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
df30: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
df40: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
df50: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
df60: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
df70: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
df80: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
df90: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
dfa0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
dfb0: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
dfc0: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
dfd0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
dfe0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
dff0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
e000: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
e010: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
e020: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
e030: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
e040: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
e050: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
e060: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
e070: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
e080: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
e090: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
e0a0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
e0b0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
e0c0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
e0d0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
e0e0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
e0f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
e100: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
e110: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e120: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
e130: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e140: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
e150: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
e160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e170: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
e190: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
e1a0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
e1b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e1c0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
e1d0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
e1e0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
e1f0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
e200: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e210: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
e220: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
e230: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
e240: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
e250: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
e260: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
e270: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
e280: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
e290: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
e2a0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
e2b0: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
e2c0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
e2d0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
e2e0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
e2f0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
e300: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
e310: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
e320: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
e330: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
e340: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
e350: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
e360: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
e370: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
e380: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
e390: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
e3a0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
e3b0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e3c0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
e3d0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
e3e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
e3f0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
e400: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
e410: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e430: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e440: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
e450: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
e460: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
e470: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
e480: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
e490: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
e4a0: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
e4b0: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
e4c0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
e4d0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
e4e0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
e4f0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
e500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e510: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
e520: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e530: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e560: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e570: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e580: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e590: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e5a0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e5b0: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e5c0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e5d0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e5e0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e5f0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e610: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e620: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e630: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e640: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e650: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e660: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e670: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e680: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e690: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e6a0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e6b0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e6c0: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e6d0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e6e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e6f0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e700: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e710: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e720: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e730: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e740: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e750: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e760: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e770: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e780: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e790: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e7a0: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e7b0: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e7c0: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e7d0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e7e0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e7f0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e800: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e810: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e820: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e830: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e840: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e850: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e860: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e870: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e880: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e890: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e8a0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e8b0: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e8c0: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e8d0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e8e0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e8f0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e900: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e910: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e920: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e930: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e940: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e950: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e960: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e970: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e980: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e990: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e9a0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e9b0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e9c0: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e9d0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e9e0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e9f0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
ea00: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
ea10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
ea20: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
ea30: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
ea40: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
ea50: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
ea60: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
ea70: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
ea80: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
ea90: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
eaa0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
eab0: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
eac0: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
ead0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
eae0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
eaf0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
eb00: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
eb10: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
eb20: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
eb30: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
eb40: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
eb50: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
eb60: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
eb70: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
eb80: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
eb90: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
eba0: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
ebb0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
ebc0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
ebd0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
ebe0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ebf0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ec00: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
ec10: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
ec20: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
ec30: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
ec40: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
ec50: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
ec60: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
ec70: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
ec80: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ec90: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
eca0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
ecb0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ecc0: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
ecd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
ece0: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
ecf0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ed00: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
ed10: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
ed20: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
ed30: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
ed40: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
ed50: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
ed60: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
ed70: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
ed80: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
ed90: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
eda0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
edb0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
edc0: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
edd0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
ede0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
edf0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ee00: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ee10: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
ee20: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
ee30: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
ee40: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
ee50: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
ee60: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ee70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ee80: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
ee90: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
eea0: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
eeb0: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
eec0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
eed0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
eee0: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
eef0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
ef00: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
ef10: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
ef20: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ef30: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ef40: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
ef50: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
ef60: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
ef70: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
ef80: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ef90: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
efa0: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
efb0: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
efc0: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
efd0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
efe0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
eff0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
f000: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f010: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
f020: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
f030: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
f040: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
f050: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
f060: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
f070: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
f080: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
f090: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
f0a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
f0b0: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
f0c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
f0d0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
f0e0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
f0f0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
f100: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
f110: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
f120: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
f130: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
f140: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
f150: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
f160: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
f170: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
f180: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
f190: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
f1a0: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
f1b0: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
f1c0: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
f1d0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
f1e0: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
f1f0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
f200: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
f210: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
f220: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
f230: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
f240: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
f250: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
f260: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f270: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
f280: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
f290: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
f2a0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
f2b0: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
f2c0: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
f2d0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
f2e0: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
f2f0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
f300: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
f310: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
f320: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
f330: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
f340: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
f350: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
f360: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
f370: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
f380: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
f390: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f3a0: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
f3b0: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
f3c0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f3d0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
f3e0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
f3f0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
f400: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
f410: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
f420: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
f430: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
f440: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
f450: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
f460: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
f470: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f480: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
f490: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
f4a0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
f4b0: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
f4c0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
f4d0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
f4e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f4f0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
f500: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
f510: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
f520: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f530: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f540: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f550: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f560: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f570: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f580: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f590: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f5a0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f5b0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f5c0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f5d0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f5e0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f5f0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f600: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f610: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f620: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f630: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f640: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f650: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f660: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f670: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f680: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f690: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f6a0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f6b0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f6c0: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f6d0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f6e0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f6f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f700: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f710: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f720: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f730: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f740: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f750: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f760: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f770: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f780: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f790: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f7a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f7b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f7c0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f7d0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f7e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f7f0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f800: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f810: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f820: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f830: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f840: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f850: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f860: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f870: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f880: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f890: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f8a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f8b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f8c0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f8d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f8e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f8f0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f900: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f910: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f930: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f940: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f950: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f960: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f970: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f980: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f990: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f9a0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f9c0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f9d0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f9e0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f9f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
fa20: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
fa30: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
fa40: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
fa50: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
fa60: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
fa70: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
fa80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
fa90: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
faa0: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
fab0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
fac0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
fad0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
fae0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
faf0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
fb00: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
fb10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
fb20: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
fb30: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
fb40: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
fb50: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
fb60: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
fb70: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
fb80: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
fb90: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
fba0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
fbb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fbc0: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
fbd0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
fbe0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
fbf0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
fc00: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
fc10: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
fc20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fc30: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
fc40: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
fc50: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
fc60: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
fc70: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
fc80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fc90: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
fca0: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
fcb0: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
fcc0: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
fcd0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
fce0: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
fcf0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
fd00: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
fd10: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fd20: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
fd30: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
fd40: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
fd50: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
fd60: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
fd70: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
fd80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
fd90: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
fda0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
fdb0: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
fdc0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
fdd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fde0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fdf0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
fe00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
fe10: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
fe20: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fe30: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
fe40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
fe50: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
fe60: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
fe70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fe80: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
fe90: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
fea0: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
feb0: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
fec0: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
fed0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
fee0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fef0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
ff00: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
ff10: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
ff20: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
ff30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
ff40: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
ff50: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
ff60: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
ff70: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
ff80: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ff90: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
ffa0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
ffb0: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
ffc0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
ffd0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ffe0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fff0: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
10000 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10010 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
10020 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
10030 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
10040 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
10050 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
10060 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
10070 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
10080 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100a0 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
100b0 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
100c0 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
100d0 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
100e0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
100f0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10100 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
10110 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
10120 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10130 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10140 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
10150 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
10160 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10170 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10180 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10190 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
101a0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
101b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
101c0 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
101d0 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
101e0 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
101f0 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
10200 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
10210 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
10220 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
10230 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
10240 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
10250 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
10260 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
10270 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
10280 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
10290 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
102a0 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
102b0 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
102c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
102d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
102e0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
102f0 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
10300 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
10310 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
10320 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
10330 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
10340 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
10350 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
10360 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
10370 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
10380 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
10390 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
103a0 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
103b0 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
103c0 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
103d0 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
103e0 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
103f0 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10400 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
10410 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
10420 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
10430 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
10440 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
10450 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
10460 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
10470 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
10480 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
10490 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
104a0 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
104b0 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
104c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
104d0 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
104e0 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
104f0 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
10500 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
10510 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
10520 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10530 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10540 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10550 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10560 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10570 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10580 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10590 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
105a0 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
105b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
105c0 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
105d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
105e0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
105f0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10600 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
10610 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10620 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10630 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10640 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10650 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10660 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10670 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10680 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10690 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
106a0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
106b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
106c0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
106d0 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
106e0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
106f0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10700 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10710 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10720 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10730 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10740 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10750 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10760 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10770 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10780 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10790 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
107a0 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
107b0 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
107c0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
107d0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
107e0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
107f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10800 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10810 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10820 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10830 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10840 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10850 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10860 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10870 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10880 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10890 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
108a0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
108b0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
108c0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
108d0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
108e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
108f0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10900 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10910 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10920 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10930 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10940 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10950 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10960 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10970 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
10980 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
10990 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
109a0 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
109b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
109c0 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
109d0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
109e0 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
109f0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10a00 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10a10 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
10a20 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10a30 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10a40 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10a50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10a60 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10a70 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10a80 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
10a90 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10aa0 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10ab0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10ac0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10ad0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
10ae0 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
10af0 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
10b00 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10b10 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
10b20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10b30 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10b40 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10b50 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10b60 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10b70 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
10b80 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
10b90 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
10ba0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10bb0 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10bc0 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
10bd0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
10be0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
10bf0 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
10c00 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
10c10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
10c20 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10c30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10c40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10c50 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10c80 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10c90 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10cb0 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10cc0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
10cd0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
10d00 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
10d10 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
10d20 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10d40 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10d50 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10d60 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10d90 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10da0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10db0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10dc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
10dd0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
10de0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
10df0 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
10e00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10e10 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10e20 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10e30 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
10e40 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20  ->jfd).  ){.    
10e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10e60 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10e70 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
10e80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10e90 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
10ea0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10eb0 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
10ec0 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
10ed0 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
10ee0 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
10ef0 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10f00 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10f10 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10f20 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10f30 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10f40 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10f50 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10f60 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10f70 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10f80 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10f90 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
10fa0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10fb0 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
10fc0 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
10fd0 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
10fe0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10ff0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
11000 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
11010 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
11020 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
11030 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11040 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
11050 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
11060 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
11070 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
11080 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
11090 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
110a0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
110b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
110c0 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
110d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
110e0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
110f0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
11100 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
11110 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
11120 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
11130 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
11140 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
11150 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
11160 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
11170 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
11180 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
11190 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
111a0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
111b0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
111c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
111d0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
111e0 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
111f0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11200 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11210 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11220 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
11230 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11240 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
11250 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
11260 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
11270 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d      iHdrOff+4+nM
112a0 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
112b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
112c0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
112d0 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
112e0 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
112f0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11300 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
11310 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
11320 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
11330 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
11340 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
11350 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
11360 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11370 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
11380 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
11390 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
113a0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
113b0 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
113c0 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
113d0 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
113e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
113f0 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
11400 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
11410 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11420 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
11430 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
11440 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
11450 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
11460 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
11470 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
11480 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
11490 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
114a0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
114b0 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
114c0 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
114d0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
114e0 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
114f0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11500 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
11510 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
11520 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
11530 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
11540 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
11550 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
11560 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
11570 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
11580 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11590 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
115a0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
115b0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
115c0 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
115d0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
115e0 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
115f0 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69  er){.  pPager->i
11600 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20  DataVersion++;. 
11610 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
11620 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
11630 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65  ackup);.  sqlite
11640 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
11650 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
11660 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11670 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  he pPager->iData
11680 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f  Version value.*/
11690 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65  .u32 sqlite3Page
116a0 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67  rDataVersion(Pag
116b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
116c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
116d0 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
116e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
116f0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11700 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n;.}../*.** Free
11710 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11720 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11730 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11740 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11750 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11760 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11770 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11780 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11790 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
117a0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
117b0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
117c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
117d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
117e0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
117f0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11800 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11820 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11830 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11840 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11850 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11860 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11870 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11880 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11890 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
118a0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
118b0 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
118c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
118d0 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
118e0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
118f0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
11900 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11910 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11920 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11930 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
11940 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11950 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11960 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11970 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11980 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11990 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
119a0 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
119b0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
119c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
119d0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
119e0 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
119f0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11a00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11a10 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11a20 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11a30 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11a40 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11a50 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11a60 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11a70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11a80 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11a90 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11aa0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11ab0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11ac0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11ad0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
11ae0 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
11af0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11b00 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11b10 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11b20 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11b30 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11b40 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11b50 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11b60 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11b70 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11b80 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11b90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11ba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
11bb0 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
11bc0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
11bd0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
11be0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
11bf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11c00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11c10 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11c20 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  p if the pager i
11c30 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
11c40 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69  ode and not.** i
11c50 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
11c60 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
11c70 20 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61   switches the pa
11c80 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ger to PAGER_OPE
11c90 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  N.** state..**.*
11ca0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
11cb0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11cc0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20  ve-access mode, 
11cd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11ce0 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  e is.** complete
11cf0 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20  ly unlocked. If 
11d00 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
11d10 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c  cked and the fil
11d20 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a  e-system does.**
11d30 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65   not exhibit the
11d40 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45   UNDELETABLE_WHE
11d50 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c  N_OPEN property,
11d60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11d70 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28  e is.** closed (
11d80 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a  if it is open)..
11d90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
11da0 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73  er is in ERROR s
11db0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
11dc0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
11dd0 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  d, the .** conte
11de0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
11df0 20 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61   cache are disca
11e00 72 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74  rded before swit
11e10 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a  ching back to .*
11e20 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  * the OPEN state
11e30 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
11e40 77 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65  whether the page
11e50 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11e60 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74  e-mode.** or not
11e70 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  , any journal fi
11e80 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  le left in the f
11e90 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20  ile-system will 
11ea0 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73  be treated.** as
11eb0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
11ec0 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  nd rolled back t
11ed0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72  he next time a r
11ee0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
11ef0 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79  ** is opened (by
11f00 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20   this or by any 
11f10 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11f20 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
11f30 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
11f40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
11f50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11f60 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11f70 52 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c  READER .       |
11f80 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11f90 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20  ==PAGER_OPEN .  
11fa0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
11fb0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
11fc0 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c  ROR .  );..  sql
11fd0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
11fe0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
11ff0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
12000 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
12010 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
12020 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
12030 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
12040 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
12050 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
12060 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
12070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
12080 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
12090 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
120a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
120b0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
120c0 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
120d0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
120e0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
120f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
12110 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
12120 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
12130 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
12140 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
12150 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
12160 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
12170 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
12180 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
12190 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
121a0 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
121b0 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
121c0 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
121d0 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
121e0 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
121f0 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
12200 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
12210 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
12220 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
12230 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
12240 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
12250 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
12260 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
12270 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
12280 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12290 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
122a0 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
122b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
122c0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
122d0 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
122e0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
122f0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12300 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
12310 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12320 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12330 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
12340 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12350 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12360 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
12370 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
12380 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12390 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
123a0 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
123b0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
123c0 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
123d0 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
123e0 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
123f0 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
12400 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
12410 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
12420 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
12430 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
12440 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
12450 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
12460 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
12470 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
12480 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
12490 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
124a0 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
124b0 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
124c0 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
124d0 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
124e0 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
124f0 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
12500 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
12510 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
12520 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
12530 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
12540 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
12550 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
12560 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
12570 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
12580 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12590 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
125a0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
125b0 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
125c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
125d0 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
125e0 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
125f0 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
12600 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
12610 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
12620 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
12630 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
12640 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
12650 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
12660 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
12670 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
12680 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
12690 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
126a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
126b0 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
126c0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
126d0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
126e0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
126f0 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
12700 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12710 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12720 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
12730 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12740 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
12750 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12760 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
12770 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
12780 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
12790 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
127a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
127b0 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
127c0 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
127d0 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
127e0 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
127f0 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
12800 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
12810 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12820 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  de..  */.  if( p
12830 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12840 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
12850 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
12860 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12870 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
12880 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
12890 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
128a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
128b0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
128c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
128d0 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
128e0 4b 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  K;.    if( USEFE
128f0 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
12900 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
12910 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
12920 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
12930 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
12940 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12950 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61  alHdr = 0;.  pPa
12960 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
12970 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
12980 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12990 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e  lled whenever an
129a0 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65   IOERR or FULL e
129b0 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72  rror that requir
129c0 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  es.** the pager 
129d0 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e  to transition in
129e0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
129f0 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75  te may ahve occu
12a00 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72  rred..** The fir
12a10 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
12a20 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12a30 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
12a40 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
12a50 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
12a60 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
12a70 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
12a80 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
12a90 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72   .** value retur
12aa0 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
12ab0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12ac0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
12ad0 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
12ae0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12af0 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46  ment is SQLITE_F
12b00 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
12b10 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a  R or one of the.
12b20 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64  ** IOERR sub-cod
12b30 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e  es, the pager en
12b40 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73  ters the ERROR s
12b50 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72  tate and the err
12b60 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74  or code.** is st
12b70 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72  ored in Pager.er
12b80 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65  rCode. While the
12b90 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69   pager remains i
12ba0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
12bb0 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20  e,.** all major 
12bc0 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  API calls on the
12bd0 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
12be0 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50  diately return P
12bf0 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a  ager.errCode..**
12c00 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74  .** The ERROR st
12c10 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ate indicates th
12c20 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
12c30 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12c40 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
12c50 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
12c60 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
12c70 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
12c80 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
12c90 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12ca0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
12cb0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
12cc0 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
12cd0 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
12ce0 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
12cf0 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
12d00 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
12d10 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
12d20 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
12d30 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
12d40 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
12d50 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
12d60 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
12d70 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
12d80 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
12d90 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
12da0 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
12db0 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
12dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
12dd0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12de0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
12df0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12e00 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12e10 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
12e20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12e30 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
12e40 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
12e50 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
12e60 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
12e70 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
12e80 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
12e90 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
12ea0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12eb0 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61  de = rc;.    pPa
12ec0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12ed0 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  GER_ERROR;.  }. 
12ee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
12ef0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12f00 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
12f10 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
12f20 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ge);../*.** This
12f30 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
12f40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
12f50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
12f60 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
12f70 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
12f80 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
12f90 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
12fa0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
12fb0 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
12fc0 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
12fd0 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
12fe0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12ff0 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
13000 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
13010 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
13020 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
13030 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
13040 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
13050 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
13060 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
13070 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
13080 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
13090 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
130a0 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
130b0 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
130c0 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
130d0 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
130e0 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
130f0 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
13100 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
13110 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
13120 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
13130 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
13140 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
13150 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
13160 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
13170 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
13180 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
13190 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
131a0 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
131b0 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
131c0 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
131d0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
131e0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
131f0 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
13200 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
13210 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
13220 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
13230 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
13240 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
13250 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
13260 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
13270 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
13280 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
13290 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
132a0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
132b0 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
132c0 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
132d0 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
132e0 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
132f0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
13300 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
13310 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
13320 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
13330 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
13340 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
13350 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
13360 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
13370 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
13380 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
13390 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
133a0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
133b0 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
133c0 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
133d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
133e0 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
133f0 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
13400 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
13410 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
13420 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
13430 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
13440 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
13450 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
13460 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
13470 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
13480 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
13490 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
134a0 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
134b0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
134c0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
134d0 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
134e0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
134f0 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
13500 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
13510 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
13520 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
13530 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
13540 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13550 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
13560 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
13570 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13580 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
13590 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
135a0 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
135b0 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
135c0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
135d0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
135e0 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
135f0 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
13600 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13610 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
13620 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
13630 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
13640 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
13650 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
13660 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
13670 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
13680 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
13690 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
136a0 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
136b0 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
136c0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
136d0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
136e0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
136f0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
13700 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
13710 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
13720 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
13730 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
13740 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
13750 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
13760 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
13770 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
13780 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
13790 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
137a0 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
137b0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
137c0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
137d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
137e0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
137f0 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
13800 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
13810 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
13820 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
13830 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
13840 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13850 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
13860 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
13870 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
13880 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
13890 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
138a0 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
138b0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
138c0 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
138d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
138e0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
138f0 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
13900 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
13910 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
13920 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13930 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
13940 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
13950 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
13960 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
13970 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
13980 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
13990 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
139a0 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
139b0 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  peration */..  /
139c0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
139d0 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
139e0 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  ot have an open 
139f0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13a00 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61  n.  ** or at lea
13a10 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
13a20 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ck. This functio
13a30 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
13a40 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20  when there.  ** 
13a50 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
13a60 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62  saction active b
13a70 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ut a RESERVED or
13a80 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
13a90 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72  .  ** held under
13aa0 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
13ab0 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  es:.  **.  **   
13ac0 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65  1. After a succe
13ad0 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61  ssful hot-journa
13ae0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
13af0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20  s called with.  
13b00 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d  **      eState==
13b10 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65  PAGER_NONE and e
13b20 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13b30 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  LOCK..  **.  ** 
13b40 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63    2. If a connec
13b50 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e  tion with lockin
13b60 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
13b70 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
13b80 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20  USIVE .  **     
13b90 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62   lock switches b
13ba0 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d  ack to locking_m
13bb0 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74  ode=normal and t
13bc0 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20  hen executes a. 
13bd0 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72   **      read-tr
13be0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
13bf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13c00 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d  ed with eState==
13c10 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
13c20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63  **      and eLoc
13c30 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
13c40 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d  K when the read-
13c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
13c60 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  losed..  */.  as
13c70 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
13c80 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
13c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13ca0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
13cb0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  GER_ERROR );.  i
13cc0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
13cd0 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e<PAGER_WRITER_L
13ce0 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d  OCKED && pPager-
13cf0 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f  >eLock<RESERVED_
13d00 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
13d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13d20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  }..  releaseAllS
13d30 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
13d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
13d50 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
13d60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
13d70 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69  ournal==0 );.  i
13d80 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
13d90 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73  ->jfd) ){.    as
13da0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
13db0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
13dc0 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74     /* Finalize t
13dd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13de0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
13df0 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
13e00 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
13e10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13e20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13e30 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13e40 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
13e50 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13e60 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
13e70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13e80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13e90 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13ea0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
13eb0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
13ec0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
13ee0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13f00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13f10 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
13f20 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
13f30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13f40 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
13f50 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
13f60 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
13f70 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  re the new file 
13f80 73 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20  size is written 
13f90 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72  into the inode r
13fa0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20  ight away..     
13fb0 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
13fc0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  e the journal mi
13fd0 67 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f  ght resurrect fo
13fe0 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20  llowing a power 
13ff0 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20  loss and.       
14000 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20     ** cause the 
14010 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  last transaction
14020 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20   to roll back.  
14030 53 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  See.          **
14040 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
14050 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68  a.mozilla.org/sh
14060 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30  ow_bug.cgi?id=10
14070 37 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20  72773.          
14080 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
14090 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
140a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
140b0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
140c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
140d0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
140e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
140f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
14100 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14110 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14120 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
14130 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
14140 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
14150 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14160 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
14170 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
14180 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
14190 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
141a0 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
141b0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
141c0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
141d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
141e0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
141f0 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20  may be executed 
14200 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e  with Pager.journ
14210 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69  alMode==MEMORY i
14220 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74  f.      ** a hot
14230 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73  -journal was jus
14240 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  t rolled back. I
14250 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
14260 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
14270 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
14280 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
14290 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e  ed. If this conn
142a0 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f  ection writes to
142b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
142c0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20  tabase file, it 
142d0 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67  will do so using
142e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
142f0 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f  urnal. .      */
14300 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65  .      int bDele
14310 74 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74  te = (!pPager->t
14320 65 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74  empFile && sqlit
14330 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28  e3JournalExists(
14340 70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20  pPager->jfd));. 
14350 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14360 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14370 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14380 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20  ODE_DELETE .    
14390 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
143a0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
143b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
143c0 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20  _MEMORY .       
143d0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
143e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
143f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
14400 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
14410 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
14420 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
14430 20 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65       if( bDelete
14440 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14450 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
14460 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
14470 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
14480 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
14490 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
144a0 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
144b0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
144c0 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  S.  sqlite3Pcach
144d0 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
144e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
144f0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
14500 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
14510 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73  ->dbSize==0 && s
14520 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
14530 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
14540 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50  ache)>0 ){.    P
14550 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  gHdr *p = sqlite
14560 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
14570 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ger, 1);.    if(
14580 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70   p ){.      p->p
14590 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  ageHash = 0;.   
145a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
145b0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a  nrefNotNull(p);.
145c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
145d0 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
145e0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
145f0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
14600 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
14610 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  al = 0;.  pPager
14620 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71  ->nRec = 0;.  sq
14630 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
14640 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
14650 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  che);.  sqlite3P
14660 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
14670 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
14680 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
14690 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
146a0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
146b0 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41    /* Drop the WA
146c0 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66  L write-lock, if
146d0 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74   any. Also, if t
146e0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  he connection wa
146f0 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  s in .    ** loc
14700 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
14710 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20  ive mode but is 
14720 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20  no longer, drop 
14730 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20  the EXCLUSIVE . 
14740 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20     ** lock held 
14750 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14760 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
14770 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61   rc2 = sqlite3Wa
14780 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63  lEndWriteTransac
14790 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
147a0 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
147b0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
147c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
147d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
147e0 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72  Commit && pPager
147f0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61  ->dbFileSize>pPa
14800 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
14810 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
14820 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
14830 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
14840 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c  nsaction in roll
14850 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  back-journal.   
14860 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20   ** mode if the 
14870 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
14880 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20   disk is larger 
14890 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
148a0 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20  e image..    ** 
148b0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
148c0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
148d0 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64  en finalized and
148e0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
148f0 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73   .    ** success
14900 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c  fully committed,
14910 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49   but the EXCLUSI
14920 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c  VE lock is still
14930 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20   held on the.   
14940 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20   ** file. So it 
14950 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63  is safe to trunc
14960 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
14970 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e   file to its min
14980 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75  imum.    ** requ
14990 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  ired size.  */. 
149a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
149b0 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
149c0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
149d0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
149e0 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
149f0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
14a00 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14a10 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74  TE_OK && bCommit
14a20 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
14a30 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63  r->fd) ){.    rc
14a40 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
14a50 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
14a60 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
14a70 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f  _COMMIT_PHASETWO
14a80 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
14a90 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
14aa0 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  D ) rc = SQLITE_
14ab0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
14ac0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14ad0 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70  eMode .   && (!p
14ae0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
14af0 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c  r) || sqlite3Wal
14b00 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
14b10 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a  ager->pWal, 0)).
14b20 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70    ){.    rc2 = p
14b30 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
14b40 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
14b50 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
14b60 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
14b70 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
14b80 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
14b90 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65  _READER;.  pPage
14ba0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
14bb0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
14bc0 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
14bd0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  c);.}../*.** Exe
14be0 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
14bf0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
14c00 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
14c10 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
14c20 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
14c30 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
14c40 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
14c50 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
14c60 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
14c70 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
14c80 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
14c90 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
14ca0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
14cb0 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
14cc0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
14cd0 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
14ce0 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
14cf0 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
14d00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14d10 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  le and move the 
14d20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50  pager back to OP
14d30 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  EN state. If thi
14d40 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  s .** means that
14d50 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d   there is a hot-
14d60 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20  journal left in 
14d70 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
14d80 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f   the next .** co
14d90 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  nnection to obta
14da0 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
14db0 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77   on the pager (w
14dc0 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73  hich may be this
14dd0 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72   one) .** will r
14de0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
14df0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14e00 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
14e10 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
14e20 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20  R state, but an 
14e30 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20  IO or.** malloc 
14e40 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
14e50 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
14e60 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69  then this will i
14e70 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20  tself cause .** 
14e80 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
14e90 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  er the ERROR sta
14ea0 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62  te. Which will b
14eb0 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65  e cleared by the
14ec0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
14ed0 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64  r_unlock(), as d
14ee0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a  escribed above..
14ef0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
14f00 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
14f10 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
14f20 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
14f30 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
14f40 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65  R_ERROR && pPage
14f50 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14f60 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73  _OPEN ){.    ass
14f70 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
14f80 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
14f90 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
14fa0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
14fb0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
14fc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
14fd0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
14fe0 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
14ff0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
15000 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
15010 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
15020 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73  lloc();.    }els
15030 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
15040 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
15050 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
15060 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
15070 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
15080 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72      pager_end_tr
15090 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
150a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
150b0 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
150c0 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
150d0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
150e0 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
150f0 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
15100 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
15110 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
15120 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
15130 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
15140 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
15150 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
15160 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
15170 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
15180 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
15190 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
151a0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
151b0 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
151c0 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
151d0 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
151e0 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
151f0 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
15200 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
15210 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
15220 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
15230 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
15240 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
15250 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15260 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
15270 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
15280 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
15290 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
152a0 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
152b0 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
152c0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
152d0 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
152e0 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
152f0 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
15300 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
15310 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
15320 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
15330 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
15340 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
15350 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
15360 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
15370 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
15380 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
15390 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
153a0 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
153b0 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
153c0 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
153d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
153e0 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
153f0 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
15400 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
15410 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
15420 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
15430 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
15440 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
15450 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
15460 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
15470 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
15480 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
15490 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
154a0 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
154b0 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
154c0 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
154d0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
154e0 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
154f0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
15500 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
15510 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
15520 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15530 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
15540 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
15550 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
15560 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
15570 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
15580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
15590 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
155a0 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
155b0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
155c0 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
155d0 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
155e0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
155f0 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
15600 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
15610 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
15620 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
15630 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
15640 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
15650 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
15660 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
15670 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15690 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
156a0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
156b0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
156c0 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
156d0 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
156e0 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
156f0 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
15700 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23  dec */.#endif..#
15710 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
15720 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b  _CODEC./*.** Mak
15730 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  e sure the numbe
15740 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 69  r of reserved bi
15750 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 69  ts is the same i
15760 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  n the destinatio
15770 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74  n.** pager as it
15780 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63   is in the sourc
15790 65 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75  e.  This comes u
157a0 70 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20  p when a VACUUM 
157b0 63 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e  changes the.** n
157c0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
157d0 64 20 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f  d bits to the "o
157e0 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a  ptimal" amount..
157f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
15800 61 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65  agerAlignReserve
15810 28 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50  (Pager *pDest, P
15820 61 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69  ager *pSrc){.  i
15830 66 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72  f( pDest->nReser
15840 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72  ve!=pSrc->nReser
15850 76 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d  ve ){.    pDest-
15860 3e 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72 63  >nReserve = pSrc
15870 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
15880 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15890 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pDest);.  }.}.#e
158a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
158b0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
158c0 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
158d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
158e0 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
158f0 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
15900 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
15910 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
15920 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
15930 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
15940 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
15950 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
15960 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
15970 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
15980 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
15990 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
159a0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
159b0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
159c0 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
159d0 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20  ck journal uses 
159e0 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20  checksums - the 
159f0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
15a00 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a  l does .** not..
15a10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
15a20 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
15a30 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
15a40 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15a50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15a60 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
15a70 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
15a80 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
15a90 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
15aa0 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
15ab0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
15ac0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
15ad0 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
15ae0 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
15af0 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
15b00 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
15b10 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
15b20 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
15b30 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
15b40 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
15b50 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
15b60 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
15b70 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
15b80 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
15b90 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
15ba0 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
15bb0 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
15bc0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
15bd0 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
15be0 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
15bf0 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
15c00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
15c10 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
15c20 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
15c30 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15c40 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
15c50 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
15c60 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
15c70 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
15c80 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
15c90 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
15ca0 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
15cb0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
15cc0 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
15cd0 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
15ce0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
15cf0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
15d00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
15d10 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
15d20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
15d30 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15d40 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15d50 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
15d60 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
15d70 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
15d80 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
15d90 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
15da0 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
15db0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
15dc0 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
15dd0 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
15de0 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
15df0 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
15e00 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
15e10 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
15e20 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
15e30 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
15e40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
15e50 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
15e60 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
15e70 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
15e80 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
15e90 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
15ea0 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
15eb0 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
15ec0 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
15ed0 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
15ee0 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
15ef0 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
15f00 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
15f10 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
15f20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
15f30 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
15f40 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
15f50 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
15f60 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
15f70 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
15f80 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
15f90 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
15fa0 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
15fb0 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
15fc0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15fe0 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
15ff0 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
16000 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20  i64 *pOffset,   
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16020 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72   Offset of recor
16030 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f  d to playback */
16040 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
16050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16060 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
16070 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
16080 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
16090 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
160a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
160b0 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
160c0 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
160d0 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  l. */.  int isSa
160e0 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20  vepnt           
160f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
16100 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
16110 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  llback */.){.  i
16120 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
16130 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
16140 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
16150 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
16160 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
16170 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
16180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16190 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
161a0 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
161b0 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
161c0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
161d0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
161e0 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
161f0 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
16200 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20  char *aData;    
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16220 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   Temporary stora
16230 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ge for the page 
16240 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
16250 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  e *jfd;         
16260 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
16270 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
16280 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
16290 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64  /.  int isSynced
162a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
162b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
162c0 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e  rnal page is syn
162d0 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ced */..  assert
162e0 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31  ( (isMainJrnl&~1
162f0 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  )==0 );      /* 
16300 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20  isMainJrnl is 0 
16310 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
16320 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29  ( (isSavepnt&~1)
16330 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  ==0 );       /* 
16340 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f  isSavepnt is 0 o
16350 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
16360 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70   isMainJrnl || p
16370 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70  Done );     /* p
16380 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64  Done always used
16390 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73   on sub-journals
163a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
163b0 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65  Savepnt || pDone
163c0 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e  ==0 );   /* pDon
163d0 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20  e never used on 
163e0 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f  non-savepoint */
163f0 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67  ..  aData = pPag
16400 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
16410 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
16420 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
16430 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
16440 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
16450 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
16460 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
16470 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
16480 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  | (!isMainJrnl &
16490 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a  & isSavepnt) );.
164a0 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65  .  /* Either the
164b0 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65   state is greate
164c0 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49  r than PAGER_WRI
164d0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20  TER_CACHEMOD (a 
164e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
164f0 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  * or savepoint r
16500 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20  ollback done at 
16510 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74  the request of t
16520 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68  he caller) or th
16530 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74  is is.  ** a hot
16540 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
16550 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f  k. If it is a ho
16560 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
16570 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20  ck, the pager.  
16580 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f  ** is in state O
16590 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e  PEN and holds an
165a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
165b0 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   Hot-journal rol
165c0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20  lback.  ** only 
165d0 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  reads from the m
165e0 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74  ain journal, not
165f0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16600 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16610 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
16620 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
16630 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
16640 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
16650 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
16660 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
16670 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
16680 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
16690 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
166a0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
166b0 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e  MOD || isMainJrn
166c0 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  l );..  /* Read 
166d0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
166e0 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
166f0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
16700 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
16710 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
16720 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
16730 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
16740 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
16750 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
16760 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
16770 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
16780 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
16790 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
167a0 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
167b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
167c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
167d0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
167e0 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
167f0 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
16800 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
16810 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
16820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16830 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
16840 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
16850 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
16860 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
16870 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
16880 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
16890 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
168a0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
168b0 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
168c0 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
168d0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
168e0 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
168f0 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
16900 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
16910 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
16920 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
16930 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
16940 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
16950 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
16960 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
16970 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
16980 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
16990 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
169a0 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
169b0 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
169c0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
169d0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
169e0 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
169f0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
16a00 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
16a10 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
16a20 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
16a30 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
16a40 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
16a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16a60 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
16a70 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
16a80 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
16a90 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
16aa0 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
16ab0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
16ac0 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
16ad0 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
16ae0 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
16af0 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
16b00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16b10 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
16b20 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
16b30 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  s page has alrea
16b40 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
16b50 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e  ack before durin
16b60 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
16b70 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
16b80 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
16b90 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
16ba0 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
16bb0 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
16bc0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
16bd0 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
16be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16bf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16c00 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
16c10 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
16c20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
16c30 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
16c40 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
16c50 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
16c60 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
16c70 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
16c80 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
16c90 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
16ca0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
16cb0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
16cc0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
16cd0 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
16ce0 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
16cf0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
16d00 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
16d10 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
16d20 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
16d30 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
16d40 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
16d50 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
16d60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16d70 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
16d80 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
16d90 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
16da0 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
16db0 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
16dc0 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
16dd0 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
16de0 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
16df0 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
16e00 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
16e10 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
16e20 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
16e30 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
16e40 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
16e50 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
16e60 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
16e70 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
16e80 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
16e90 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
16ea0 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
16eb0 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
16ec0 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
16ed0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
16ee0 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
16ef0 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
16f00 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
16f10 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
16f20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
16f30 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
16f40 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
16f50 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
16f60 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
16f70 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
16f80 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
16f90 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
16fa0 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
16fb0 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
16fc0 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
16fd0 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
16fe0 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
16ff0 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
17000 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
17010 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
17020 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
17030 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
17040 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
17050 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
17060 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
17070 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
17080 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
17090 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
170a0 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
170b0 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
170c0 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
170d0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
170e0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
170f0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17100 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
17110 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
17120 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
17130 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
17140 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
17150 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
17160 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
17170 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
17180 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
17190 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
171a0 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
171b0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
171c0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
171d0 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
171e0 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
171f0 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
17200 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
17210 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
17220 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
17230 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
17240 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
17250 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
17260 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
17270 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
17280 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
17290 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
172a0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
172b0 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
172c0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
172d0 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
172e0 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
172f0 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
17300 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
17310 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
17320 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
17330 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
17340 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
17350 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
17360 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
17370 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
17380 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
17390 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
173a0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
173b0 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
173c0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
173d0 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
173e0 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
173f0 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
17400 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
17410 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
17420 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
17430 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
17440 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
17450 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
17460 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
17470 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
17480 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
17490 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
174a0 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
174b0 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
174c0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
174d0 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
174e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
174f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
17500 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
17510 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
17520 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
17530 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  Lookup(pPager, p
17540 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
17550 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
17560 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
17570 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
17580 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
17590 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  ==0 );.  PAGERTR
175a0 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
175b0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
175c0 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
175d0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
175e0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
175f0 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
17600 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
17610 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20  u8*)aData),.    
17620 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72         (isMainJr
17630 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c  nl?"main-journal
17640 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29  ":"sub-journal")
17650 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d  .  ));.  if( isM
17660 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69  ainJrnl ){.    i
17670 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  sSynced = pPager
17680 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f  ->noSync || (*pO
17690 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d  ffset <= pPager-
176a0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
176b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e  }else{.    isSyn
176c0 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c  ced = (pPg==0 ||
176d0 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20   0==(pPg->flags 
176e0 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
176f0 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  C));.  }.  if( i
17700 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
17710 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
17720 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
17730 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
17740 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
17750 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26  AGER_OPEN).   &&
17760 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
17770 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
17780 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
17790 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
177a0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
177b0 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
177c0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
177d0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
177e0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
177f0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
17800 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
17810 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
17820 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
17830 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67  u8 *)aData, pPag
17840 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
17850 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
17860 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
17870 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
17880 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
17890 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
178a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
178b0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
178c0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
178d0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
178e0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
178f0 4b 50 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  KPT);.      sqli
17900 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
17910 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
17920 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74   pgno, (u8*)aDat
17930 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32  a);.      CODEC2
17940 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
17950 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49  pgno, 7, rc=SQLI
17960 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61  TE_NOMEM_BKPT, a
17970 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
17980 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e  else if( !isMain
17990 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29  Jrnl && pPg==0 )
179a0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
179b0 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
179c0 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  f a savepoint an
179d0 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77  d data was not w
179e0 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a  ritten to.    **
179f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
17a00 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
17a10 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65  t in-memory, the
17a20 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61  re is a potentia
17a30 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  l.    ** problem
17a40 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20  . When the page 
17a50 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20  is next fetched 
17a60 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
17a70 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20  yer, it .    ** 
17a80 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
17a90 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
17aa0 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  ile, which may o
17ab0 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20  r may not be .  
17ac0 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20    ** current. . 
17ad0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
17ae0 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20  re are a couple 
17af0 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  of different way
17b00 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  s this can happe
17b10 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65  n. All are quite
17b20 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e  .    ** obscure.
17b30 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   When running in
17b40 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64   synchronous mod
17b50 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e, this can only
17b60 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20   happen .    ** 
17b70 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
17b80 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
17b90 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
17ba0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
17bb0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70   then.    ** pop
17bc0 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76  ulated, then mov
17bd0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
17be0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e  PagerMovepage().
17bf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17c00 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
17c10 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  o add an in-memo
17c20 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  ry page to the c
17c30 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ache containing.
17c40 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20      ** the data 
17c50 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74  just read from t
17c60 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
17c70 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
17c80 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61   dirty .    ** a
17c90 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  nd if the pager 
17ca0 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e  requires a journ
17cb0 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61  al-sync, then ma
17cc0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a  rk the page as .
17cd0 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67      ** requiring
17ce0 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20   a journal-sync 
17cf0 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69  before it is wri
17d00 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
17d10 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
17d20 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nt );.    assert
17d30 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  ( (pPager->doNot
17d40 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
17d50 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29  G_ROLLBACK)==0 )
17d60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
17d70 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c  NotSpill |= SPIL
17d80 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  LFLAG_ROLLBACK;.
17d90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17da0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
17db0 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
17dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
17dd0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
17de0 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
17df0 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20  LBACK)!=0 );.   
17e00 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17e10 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41  ill &= ~SPILLFLA
17e20 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
17e30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17e40 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
17e50 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
17e60 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
17e70 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
17e80 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
17e90 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
17ea0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
17eb0 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
17ec0 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
17ed0 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
17ee0 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
17ef0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
17f00 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
17f10 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
17f20 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
17f30 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
17f40 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
17f50 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
17f60 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
17f70 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
17f80 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
17f90 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
17fa0 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
17fb0 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
17fc0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
17fd0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
17fe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
17ff0 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
18000 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
18010 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
18020 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  a, (u8*)aData, p
18030 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
18040 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52  ;.    pPager->xR
18050 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
18060 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
18070 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
18080 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
18090 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
180a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
180b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
180c0 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
180d0 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
180e0 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
180f0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
18100 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
18110 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
18120 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
18130 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
18140 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
18150 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
18160 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
18170 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
18180 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
18190 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
181a0 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
181b0 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
181c0 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
181d0 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ase..      **.  
181e0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
181f0 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
18200 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
18210 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
18220 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
18230 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
18240 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
18250 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
18260 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
18270 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
18280 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
18290 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
182a0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
182b0 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
182c0 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
182d0 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
182e0 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
182f0 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
18300 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
18310 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
18320 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
18330 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
18340 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
18350 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
18360 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
18370 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
18380 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
18390 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
183a0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
183b0 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
183c0 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
183d0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
183e0 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
183f0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
18400 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
18410 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
18420 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
18430 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
18440 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
18450 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
18460 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
18470 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
18480 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
18490 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
184a0 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
184b0 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
184c0 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
184d0 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
184e0 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
184f0 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
18500 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
18510 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
18520 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
18530 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
18540 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
18550 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
18560 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
18570 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
18580 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
18590 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  g);..    /* If t
185a0 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
185b0 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
185c0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
185d0 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
185e0 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
185f0 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
18600 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
18610 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
18620 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
18630 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
18640 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
18650 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
18660 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
18670 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
18680 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
18690 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
186a0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
186b0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
186c0 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
186d0 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 73  MEM_BKPT);.    s
186e0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
186f0 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
18700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18710 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
18720 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
18730 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
18740 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
18750 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
18760 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
18770 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
18780 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
18790 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
187a0 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
187b0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
187c0 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
187d0 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
187e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
187f0 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
18800 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
18810 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
18820 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
18830 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
18840 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
18850 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
18860 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
18870 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
18880 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ion..**.** When 
18890 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
188a0 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
188b0 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65  , it is populate
188c0 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73  d with the names
188d0 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69   .** of all of i
188e0 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ts child journal
188f0 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f  s, one after ano
18900 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20  ther, formatted 
18910 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63  as utf-8 .** enc
18920 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65  oded text. The e
18930 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64  nd of each child
18940 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
18950 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a   marked with a .
18960 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
18970 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69  r byte (0x00). i
18980 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63  .e. the entire c
18990 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73  ontents of a mas
189a0 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  ter journal.** f
189b0 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61  ile for a transa
189c0 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20  ction involving 
189d0 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69  two databases mi
189e0 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ght be:.**.**   
189f0 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62  "/home/bill/a.db
18a00 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d  -journal\x00/hom
18a10 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72  e/bill/b.db-jour
18a20 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41  nal\x00".**.** A
18a30 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18a40 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  file may only be
18a50 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c   deleted once al
18a60 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a  l of its child .
18a70 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65  ** journals have
18a80 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
18a90 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
18aa0 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65  nction reads the
18ab0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18ac0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
18ad0 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65  file into .** me
18ae0 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74  mory and loops t
18af0 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74  hrough each of t
18b00 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
18b10 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65   names. For.** e
18b20 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
18b30 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a  l, it checks if:
18b40 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68  .**.**   * if th
18b50 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
18b60 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73  exists, and if s
18b70 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  o.**   * if the 
18b80 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f  child journal co
18b90 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e  ntains a referen
18ba0 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ce to master jou
18bb0 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c  rnal .**     fil
18bc0 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  e zMaster.**.** 
18bd0 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e  If a child journ
18be0 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  al can be found 
18bf0 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74  that matches bot
18c00 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69  h of the criteri
18c10 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73  a.** above, this
18c20 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
18c30 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  s without doing 
18c40 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77  anything. Otherw
18c50 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75  ise, if.** no su
18c60 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
18c70 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66   can be found, f
18c80 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64  ile zMaster is d
18c90 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  eleted from.** t
18ca0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75  he file-system u
18cb0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
18cc0 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  lete()..**.** If
18cd0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74   an IO error wit
18ce0 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
18cf0 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  n, an error code
18d00 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
18d10 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
18d20 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20  llocates memory 
18d30 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
18d40 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61  e3Malloc(). If a
18d50 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  n allocation.** 
18d60 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
18d70 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
18d80 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
18d90 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65  o IO or malloc e
18da0 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c  rrors .** occur,
18db0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
18dc0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  turned..**.** TO
18dd0 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  DO: This functio
18de0 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69  n allocates a si
18df0 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65  ngle block of me
18e00 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  mory to load.** 
18e10 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
18e20 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
18e30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
18e40 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  This could be.**
18e50 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c   a couple of kil
18e60 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70  obytes or so - p
18e70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65  otentially large
18e80 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20  r than the page 
18e90 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  .** size..*/.sta
18ea0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
18eb0 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
18ec0 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
18ed0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
18ee0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
18ef0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
18f00 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
18f30 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
18f40 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61  Master;    /* Ma
18f50 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f  lloc'd master-jo
18f60 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
18f70 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
18f80 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
18f90 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  l;   /* Malloc'd
18fa0 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66   child-journal f
18fb0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
18fc0 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
18fd0 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
18fe0 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
18ff0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19000 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
19010 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
19020 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
19030 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
19040 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
19050 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  al;           /*
19060 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20   Pointer to one 
19070 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d  journal within M
19080 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  J file */.  char
19090 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20   *zMasterPtr;   
190a0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74        /* Space t
190b0 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61  o hold MJ filena
190c0 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61  me from a journa
190d0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
190e0 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  nMasterPtr;     
190f0 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20        /* Amount 
19100 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
19110 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72  ed to zMasterPtr
19120 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  [] */..  /* Allo
19130 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
19140 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
19150 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
19160 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
19170 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
19180 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
19190 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
191a0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
191b0 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
191c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
191d0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
191e0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
191f0 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
19200 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
19210 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
19220 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
19230 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
19240 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
19250 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
19260 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
19270 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
19280 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
19290 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
192a0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
192b0 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  NAL);.    rc = s
192c0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
192d0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
192e0 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ter, flags, 0);.
192f0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
19300 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
19310 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
19320 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
19330 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
19340 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
19350 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
19360 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  .  ** sqlite3_ma
19370 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
19380 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
19390 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20  Journal.   Also 
193a0 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66  obtain.  ** suff
193b0 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e  icient space (in
193c0 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20   zMasterPtr) to 
193d0 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f  hold the names o
193e0 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f  f master.  ** jo
193f0 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72  urnal files extr
19400 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c  acted from regul
19410 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  ar rollback-jour
19420 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  nals..  */.  rc 
19430 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
19440 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d  ize(pMaster, &nM
19450 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
19460 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19470 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
19480 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74  ter_out;.  nMast
19490 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78  erPtr = pVfs->mx
194a0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d  Pathname+1;.  zM
194b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73  asterJournal = s
194c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61  qlite3Malloc(nMa
194d0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
194e0 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20  asterPtr + 1);. 
194f0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
19500 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  rnal ){.    rc =
19510 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
19520 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c  PT;.    goto del
19530 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a  master_out;.  }.
19540 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26    zMasterPtr = &
19550 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
19560 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d  MasterJournal+1]
19570 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19580 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
19590 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
195a0 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
195b0 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  nal, 0);.  if( r
195c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
195d0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
195e0 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  t;.  zMasterJour
195f0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
19600 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75  al] = 0;..  zJou
19610 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
19620 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20  urnal;.  while( 
19630 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
19640 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
19650 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
19660 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20  int exists;.    
19670 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
19680 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72  cess(pVfs, zJour
19690 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
196a0 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
196b0 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ts);.    if( rc!
196c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
196d0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
196e0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
196f0 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a    if( exists ){.
19700 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
19710 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
19720 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
19730 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
19740 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f  ists..      ** O
19750 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
19760 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
19770 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19780 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  nal. If.      **
19790 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
197a0 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
197b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
197c0 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
197d0 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20       int c;.    
197e0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
197f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
19800 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
19810 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
19820 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19830 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a  3OsOpen(pVfs, zJ
19840 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c  ournal, pJournal
19850 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
19860 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19880 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19890 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
198a0 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
198b0 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e  erJournal(pJourn
198c0 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20  al, zMasterPtr, 
198d0 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
198e0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
198f0 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(pJournal);.   
19900 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19910 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19920 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19930 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
19940 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
19950 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d  r[0]!=0 && strcm
19960 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d  p(zMasterPtr, zM
19970 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  aster)==0;.     
19980 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
19990 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
199a0 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
199b0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
199c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
199d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
199e0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
199f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a    }.    }.    zJ
19a00 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
19a10 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
19a20 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20  nal)+1);.  }. . 
19a30 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19a40 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d  pMaster);.  rc =
19a50 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
19a60 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
19a70 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f  0);..delmaster_o
19a80 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
19a90 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
19aa0 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65  l);.  if( pMaste
19ab0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
19ac0 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
19ad0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ;.    assert( !i
19ae0 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20  sOpen(pJournal) 
19af0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19b00 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
19b10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19b20 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
19b30 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
19b40 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74  o change the act
19b50 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ual size of the 
19b60 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
19b70 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
19b80 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20  stem. This only 
19b90 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d  happens when com
19ba0 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
19bb0 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c  ction,.** or rol
19bc0 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e  ling back a tran
19bd0 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69  saction (includi
19be0 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ng rolling back 
19bf0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
19c00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69  **.** If the mai
19c10 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
19c20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
19c30 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
19c40 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42   in either.** DB
19c50 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  MOD or OPEN stat
19c60 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
19c70 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
19c80 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65  erwise, the size
19c90 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65   .** of the file
19ca0 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e   is changed to n
19cb0 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67  Page pages (nPag
19cc0 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e*pPager->pageSi
19cd0 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49  ze bytes). .** I
19ce0 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
19cf0 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  sk is currently 
19d00 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67  larger than nPag
19d10 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73  e pages, then us
19d20 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72  e the VFS.** xTr
19d30 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20  uncate() method 
19d40 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a  to truncate it..
19d50 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67  **.** Or, it mig
19d60 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
19d70 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
19d80 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
19d90 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
19da0 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
19db0 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
19dc0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
19dd0 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
19de0 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
19df0 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
19e00 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
19e10 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
19e20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
19e30 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
19e40 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
19e50 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
19e60 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
19e70 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
19e80 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
19e90 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
19ea0 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
19eb0 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
19ec0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
19ed0 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
19ee0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
19ef0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
19f00 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
19f10 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
19f20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
19f30 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
19f40 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
19f50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19f60 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
19f70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
19f80 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
19f90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19fa0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45  eState!=PAGER_RE
19fb0 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28  ADER );.  .  if(
19fc0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
19fd0 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67  fd) .   && (pPag
19fe0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
19ff0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
1a000 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1a010 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20  ==PAGER_OPEN) . 
1a020 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
1a030 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
1a040 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
1a050 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
1a060 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
1a070 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
1a080 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
1a090 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  ;.    /* TODO: I
1a0a0 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65  s it safe to use
1a0b0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
1a0c0 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72  e here? */.    r
1a0d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1a0e0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
1a0f0 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b  , &currentSize);
1a100 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73  .    newSize = s
1a110 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65  zPage*(i64)nPage
1a120 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1a130 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
1a140 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
1a150 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
1a160 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
1a170 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a180 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
1a190 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
1a1a0 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
1a1b0 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65 6e  else if( (curren
1a1c0 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e  tSize+szPage)<=n
1a1d0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1a1e0 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70    char *pTmp = p
1a1f0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1a200 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
1a210 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65  (pTmp, 0, szPage
1a220 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1a230 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
1a240 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74  Page) == current
1a250 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1a260 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
1a270 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75  ze-szPage) >  cu
1a280 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
1a290 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a2a0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1a2b0 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67  >fd, pTmp, szPag
1a2c0 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  e, newSize-szPag
1a2d0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1a2e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a2f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1a300 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
1a310 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1a320 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1a330 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a340 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69  ** Return a sani
1a350 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  tized version of
1a360 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
1a370 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c   of OS file pFil
1a380 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  e. The.** return
1a390 20 76 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e   value is guaran
1a3a0 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77  teed to lie betw
1a3b0 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53  een 32 and MAX_S
1a3c0 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69  ECTOR_SIZE..*/.i
1a3d0 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72  nt sqlite3Sector
1a3e0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1a3f0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
1a400 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f   iRet = sqlite3O
1a410 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c  sSectorSize(pFil
1a420 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33  e);.  if( iRet<3
1a430 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20  2 ){.    iRet = 
1a440 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  512;.  }else if(
1a450 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52   iRet>MAX_SECTOR
1a460 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73  _SIZE ){.    ass
1a470 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ert( MAX_SECTOR_
1a480 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20  SIZE>=512 );.   
1a490 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54   iRet = MAX_SECT
1a4a0 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72  OR_SIZE;.  }.  r
1a4b0 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f  eturn iRet;.}../
1a4c0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
1a4d0 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e  ue of the Pager.
1a4e0 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1a4f0 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ble for the give
1a500 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64  n.** pager based
1a510 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65   on the value re
1a520 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
1a530 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64  ectorSize method
1a540 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  .** of the open 
1a550 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1a560 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
1a570 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
1a580 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1a590 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
1a5a0 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
1a5b0 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
1a5c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
1a5d0 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
1a5e0 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
1a5f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
1a600 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
1a610 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1a620 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
1a630 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
1a640 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
1a650 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
1a660 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
1a670 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a680 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
1a690 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1a6a0 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
1a6b0 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
1a6c0 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
1a6d0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
1a6e0 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
1a6f0 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
1a700 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
1a710 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
1a720 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a  _SECTOR_SIZE..**
1a730 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1a740 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49  has the SQLITE_I
1a750 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1a760 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74  VERWRITE propert
1a770 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74  y, then set.** t
1a780 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a790 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20  tor size to its 
1a7a0 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35  minimum value (5
1a7b0 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73  12).  The purpos
1a7c0 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  e of.** pPager->
1a7d0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f  sectorSize is to
1a7e0 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61   define the "bla
1a7f0 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79  st radius" of by
1a800 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  tes that.** migh
1a810 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72  t change if a cr
1a820 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ash occurs while
1a830 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69   writing to a si
1a840 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20  ngle byte in.** 
1a850 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74  that range.  But
1a860 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f   with POWERSAFE_
1a870 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62  OVERWRITE, the b
1a880 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a  last radius is z
1a890 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20  ero.** (that is 
1a8a0 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f  what POWERSAFE_O
1a8b0 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c  VERWRITE means),
1a8c0 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20   so we minimize 
1a8d0 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69  the sector.** si
1a8e0 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72  ze.  For backwar
1a8f0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
1a900 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1a910 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a920 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e  rmat,.** we cann
1a930 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66  ot reduce the ef
1a940 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a950 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a  ize below 512..*
1a960 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1a970 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
1a980 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
1a990 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1a9a0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1a9b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a9c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
1a9d0 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73  empFile.   || (s
1a9e0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a9f0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1aa00 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20  ager->fd) & .   
1aa10 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1aa20 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1aa30 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a  E_OVERWRITE)!=0.
1aa40 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74    ){.    /* Sect
1aa50 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
1aa60 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
1aa70 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
1aa80 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
1aa90 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
1aaa0 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
1aab0 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
1aac0 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
1aad0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
1aae0 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20  l segfault. */. 
1aaf0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1ab00 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
1ab10 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
1ab20 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
1ab30 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1ab40 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1ab50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
1ab60 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
1ab70 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
1ab80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ab90 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
1aba0 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
1abb0 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
1abc0 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
1abd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
1abe0 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
1abf0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
1ac00 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
1ac10 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
1ac20 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
1ac30 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
1ac40 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1ac50 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1ac60 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1ac70 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
1ac80 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
1ac90 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
1aca0 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
1acb0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
1acc0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
1acd0 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
1ace0 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
1acf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
1ad00 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
1ad10 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1ad20 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1ad30 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
1ad40 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
1ad50 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
1ad60 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
1ad70 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
1ad80 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1ad90 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
1ada0 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
1adb0 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
1adc0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
1add0 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
1ade0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1adf0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1ae00 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
1ae10 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
1ae20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
1ae30 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1ae40 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
1ae50 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1ae60 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
1ae70 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
1ae80 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
1ae90 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
1aea0 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
1aeb0 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
1aec0 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
1aed0 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
1aee0 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
1aef0 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
1af00 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
1af10 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1af20 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
1af30 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
1af40 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
1af50 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
1af60 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
1af70 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
1af80 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
1af90 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
1afa0 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
1afb0 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
1afc0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
1afd0 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
1afe0 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
1aff0 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
1b000 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
1b010 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
1b020 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
1b030 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1b040 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
1b050 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
1b060 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1b070 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
1b080 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
1b090 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1b0a0 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
1b0b0 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
1b0c0 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
1b0d0 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1b0e0 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
1b0f0 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
1b100 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1b110 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1b120 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1b130 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1b140 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1b150 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1b160 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1b170 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1b180 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1b190 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1b1a0 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1b1b0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1b1c0 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1b1d0 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1b1e0 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1b1f0 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1b200 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1b210 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1b220 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1b230 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1b240 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1b250 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1b260 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1b270 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1b280 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1b290 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1b2a0 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1b2b0 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1b2c0 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1b2d0 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1b2e0 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1b2f0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1b300 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1b310 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1b320 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1b330 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1b340 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1b350 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1b360 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1b370 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1b380 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1b390 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1b3a0 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1b3b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1b3c0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1b3d0 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1b3e0 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1b3f0 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1b400 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1b410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1b420 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1b430 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1b440 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1b450 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1b460 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1b470 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1b480 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1b490 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1b4a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1b4b0 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1b4c0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1b4d0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1b4e0 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1b4f0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1b500 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1b510 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1b520 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1b530 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1b540 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1b550 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1b560 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1b570 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1b580 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1b590 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1b5a0 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1b5b0 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1b5c0 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1b5d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1b5e0 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1b5f0 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1b600 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1b610 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1b620 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1b630 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1b640 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1b650 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1b660 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1b670 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1b680 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1b690 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1b6a0 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1b6b0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1b6c0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1b6d0 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1b6e0 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1b6f0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1b700 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1b710 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1b720 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1b730 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b740 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1b750 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1b760 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1b770 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1b780 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1b790 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1b7a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1b7b0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1b7c0 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1b7d0 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1b7e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b7f0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1b800 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1b810 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1b820 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1b830 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1b840 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1b850 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1b860 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1b870 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b880 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b890 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1b8a0 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1b8b0 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1b8c0 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1b8d0 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1b8e0 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ge rollback */. 
1b8f0 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d   int nPlayback =
1b900 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74   0;       /* Tot
1b910 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1b920 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  es restored from
1b930 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f   journal */..  /
1b940 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1b950 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1b960 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1b970 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1b980 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1b990 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1b9a0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1b9b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1b9c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b9d0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1b9e0 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1b9f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ba00 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1ba10 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1ba20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1ba30 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1ba40 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1ba50 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1ba60 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1ba70 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1ba80 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1ba90 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1baa0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1bab0 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1bac0 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1bad0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1bae0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1baf0 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1bb00 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1bb10 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1bb20 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1bb30 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1bb40 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1bb50 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1bb60 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1bb70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1bb80 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1bb90 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1bba0 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1bbb0 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1bbc0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1bbd0 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1bbe0 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1bbf0 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1bc00 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1bc10 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1bc20 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1bc30 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1bc40 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1bc50 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1bc60 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1bc70 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1bc80 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1bc90 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1bca0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1bcb0 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1bcc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1bcd0 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1bce0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1bcf0 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1bd00 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1bd10 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1bd20 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1bd30 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1bd40 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1bd50 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1bd60 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1bd70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1bd80 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1bd90 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1bda0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1bdb0 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1bdc0 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1bdd0 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1bde0 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1bdf0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1be00 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1be10 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1be20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1be30 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1be40 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1be50 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1be60 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1be70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1be80 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1be90 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1bea0 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1beb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1bec0 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1bed0 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1bee0 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1bef0 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1bf00 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1bf10 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1bf20 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1bf30 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1bf40 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1bf50 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1bf60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1bf70 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1bf80 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1bf90 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1bfa0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1bfb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1bfc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bfd0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1bfe0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1bff0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1c000 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c010 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1c020 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1c030 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1c040 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1c050 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1c060 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1c070 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1c080 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1c090 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1c0a0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1c0b0 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1c0c0 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1c0d0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1c0e0 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1c0f0 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1c100 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1c110 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1c120 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1c130 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1c140 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1c150 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c160 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1c170 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c180 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1c190 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1c1a0 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1c1b0 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1c1c0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1c1d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c1e0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1c1f0 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1c200 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1c210 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1c220 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1c230 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1c240 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1c250 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1c260 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1c270 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1c280 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1c290 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1c2a0 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1c2b0 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1c2c0 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1c2d0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1c2e0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1c2f0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1c300 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1c310 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1c320 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1c330 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1c340 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1c350 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1c360 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1c370 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1c380 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1c390 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1c3a0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1c3b0 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1c3c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1c3d0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1c3e0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1c3f0 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1c400 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1c410 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1c420 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1c430 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1c440 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1c450 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1c460 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1c470 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1c480 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1c490 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1c4a0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1c4b0 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1c4c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1c4d0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1c4e0 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1c4f0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1c500 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1c510 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1c520 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1c530 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1c540 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1c550 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1c560 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1c570 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1c580 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1c590 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c5a0 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1c5b0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1c5c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c5d0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1c5e0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1c5f0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1c600 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1c610 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1c620 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1c630 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1c640 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1c650 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1c660 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1c670 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1c680 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1c690 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1c6a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1c6b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c6c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1c6d0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1c6e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1c6f0 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1c700 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1c710 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1c720 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1c730 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1c740 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1c750 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1c760 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1c770 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1c780 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1c790 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1c7a0 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1c7b0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1c7c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c7d0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1c7e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1c7f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1c800 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1c810 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1c820 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1c830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1c840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c850 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b        nPlayback+
1c860 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
1c870 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1c880 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1c890 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c8a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1c8b0 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1c8c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1c8d0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1c8e0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c8f0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1c900 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c910 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1c920 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1c930 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1c940 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1c950 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1c960 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1c970 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1c980 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1c990 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1c9a0 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1c9b0 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1c9c0 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1c9d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1c9e0 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1c9f0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1ca00 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1ca10 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1ca20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1ca30 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1ca40 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1ca50 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1ca60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1ca70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1ca80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1ca90 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1caa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1cab0 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1cac0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1cad0 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1cae0 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1caf0 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1cb00 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1cb10 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1cb20 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1cb30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1cb40 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1cb50 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1cb60 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1cb70 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1cb80 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1cb90 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1cba0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1cbb0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1cbc0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1cbd0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1cbe0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1cbf0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cc00 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1cc10 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1cc20 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1cc30 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1cc40 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1cc50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cc60 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1cc70 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1cc80 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1cc90 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1cca0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1ccb0 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1ccc0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1ccd0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1cce0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1ccf0 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1cd00 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1cd10 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1cd20 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1cd30 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1cd40 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1cd50 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67  DEBUG.  if( pPag
1cd60 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1cd70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1cd80 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
1cd90 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1cda0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1cdb0 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65  ANGED,0);.  }.#e
1cdc0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1cdd0 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1cde0 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1cdf0 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1ce00 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1ce10 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1ce20 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1ce30 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1ce40 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1ce50 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1ce60 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1ce70 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1ce80 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1ce90 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1cea0 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1ceb0 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1cec0 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1ced0 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1cee0 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1cef0 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1cf00 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1cf10 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1cf20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1cf30 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1cf40 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1cf50 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1cf60 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1cf70 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1cf80 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1cf90 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1cfa0 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1cfb0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1cfc0 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1cfd0 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1cfe0 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1cff0 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1d000 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1d010 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1d020 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1d030 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1d040 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1d050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1d060 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1d070 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1d080 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1d090 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1d0a0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1d0b0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1d0c0 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1d0d0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1d0e0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1d0f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d100 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1d110 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1d120 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1d130 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1d140 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1d150 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d160 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c  agerSync(pPager,
1d170 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
1d180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d190 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1d1a0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
1d1b0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
1d1c0 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20  ]!='\0', 0);.   
1d1d0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1d1e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1d1f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d200 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1d210 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  ] && res ){.    
1d220 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
1d230 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1d240 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
1d250 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
1d260 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
1d270 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
1d280 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
1d290 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1d2a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1d2b0 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
1d2c0 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
1d2d0 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
1d2e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d2f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48  );.  }.  if( isH
1d300 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20  ot && nPlayback 
1d310 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
1d320 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  og(SQLITE_NOTICE
1d330 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
1d340 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25 64  K, "recovered %d
1d350 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c   pages from %s",
1d360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d370 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67   nPlayback, pPag
1d380 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
1d390 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
1d3a0 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1d3b0 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
1d3c0 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
1d3d0 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
1d3e0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
1d3f0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1d400 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
1d410 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
1d420 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
1d430 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
1d440 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1d450 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
1d460 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
1d470 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1d480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1d490 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1d4a0 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
1d4b0 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1d4c0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
1d4d0 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
1d4e0 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
1d4f0 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
1d500 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d510 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1d520 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
1d530 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1d540 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
1d550 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
1d560 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
1d570 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1d580 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
1d590 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
1d5a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d5b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
1d5c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1d5d0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1d5e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1d5f0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
1d600 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1d610 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1d620 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1d630 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
1d640 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61 6d 65  *pPg, u32 iFrame
1d650 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1d660 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1d670 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63  ; /* Pager objec
1d680 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1d690 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20  h page pPg */.  
1d6a0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
1d6b0 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20  >pgno;       /* 
1d6c0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72  Page number to r
1d6d0 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ead */.  int rc 
1d6e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1d6f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d700 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  code */.  int pg
1d710 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  sz = pPager->pag
1d720 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72  eSize; /* Number
1d730 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
1d740 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
1d750 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1d760 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
1d770 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
1d780 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1d790 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64  r->fd) );..#ifnd
1d7a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1d7b0 41 4c 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20  AL.  if( iFrame 
1d7c0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  ){.    /* Try to
1d7d0 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66   pull the page f
1d7e0 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68  rom the write-ah
1d7f0 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  ead log. */.    
1d800 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52  rc = sqlite3WalR
1d810 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  eadFrame(pPager-
1d820 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70  >pWal, iFrame, p
1d830 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  gsz, pPg->pData)
1d840 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1d850 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  .  {.    i64 iOf
1d860 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
1d870 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1d880 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
1d890 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1d8a0 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
1d8b0 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66  Data, pgsz, iOff
1d8c0 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
1d8d0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1d8e0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1d8f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d900 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1d910 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1d920 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1d930 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1d940 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1d950 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1d960 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1d970 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1d980 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1d990 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1d9a0 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1d9b0 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1d9c0 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1d9d0 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1d9e0 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1d9f0 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1da00 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1da10 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1da20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1da30 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1da40 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1da50 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1da60 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1da70 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1da80 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1da90 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1daa0 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1dab0 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1dac0 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1dad0 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1dae0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1daf0 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1db00 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1db10 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1db20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1db30 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1db40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1db50 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1db60 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1db70 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1db80 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20 65 71  * white noise eq
1db90 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20  ualing 16 bytes 
1dba0 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73  of 0xff is vanis
1dbb0 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a  hingly small so.
1dbc0 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
1dbd0 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a  ld still be ok..
1dbe0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
1dbf0 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62  emset(pPager->db
1dc00 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20  FileVers, 0xff, 
1dc10 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1dc20 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1dc30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
1dc40 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26   *dbFileVers = &
1dc50 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61  ((u8*)pPg->pData
1dc60 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  )[24];.      mem
1dc70 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1dc80 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1dc90 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  ers, sizeof(pPag
1dca0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1dcb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f  ;.    }.  }.  CO
1dcc0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
1dcd0 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  ->pData, pgno, 3
1dce0 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  , rc = SQLITE_NO
1dcf0 4d 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41  MEM_BKPT);..  PA
1dd00 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1dd10 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1dd20 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1dd30 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1dd40 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1dd50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1dd60 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1dd70 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1dd80 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1dd90 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1ddb0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1ddc0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1ddd0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1dde0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ddf0 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75   Update the valu
1de00 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d  e of the change-
1de10 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65  counter at offse
1de20 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a  ts 24 and 92 in.
1de30 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  ** the header an
1de40 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72  d the sqlite ver
1de50 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
1de60 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
1de70 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e  This is an uncon
1de80 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e  ditional update.
1de90 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70    See also the p
1dea0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1deb0 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75  counter().** rou
1dec0 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20  tine which only 
1ded0 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1dee0 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68  ge-counter if th
1def0 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75  e update is actu
1df00 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20  ally.** needed, 
1df10 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
1df20 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
1df30 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61  ngeCountDone sta
1df40 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  te variable..*/.
1df50 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1df60 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1df70 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67  unter(PgHdr *pPg
1df80 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  ){.  u32 change_
1df90 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49  counter;..  /* I
1dfa0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1dfb0 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1dfc0 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1dfd0 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1dfe0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1dff0 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1e000 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65  ((u8*)pPg->pPage
1e010 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31  r->dbFileVers)+1
1e020 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1e030 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1e040 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1e050 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  nter);..  /* Als
1e060 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
1e070 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1e080 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
1e090 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79  9 and in.  ** by
1e0a0 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
1e0b0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1e0c0 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
1e0d0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1e0e0 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20  .  ** is valid. 
1e0f0 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  */.  put32bits((
1e100 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1e110 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
1e120 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62  unter);.  put32b
1e130 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1e140 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
1e150 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1e160 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  R);.}..#ifndef S
1e170 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1e180 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e190 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
1e1a0 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
1e1b0 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1e1c0 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
1e1d0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
1e1e0 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
1e1f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1e200 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
1e210 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
1e220 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1e230 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
1e240 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
1e250 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
1e260 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1e270 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1e280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1e290 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
1e2a0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
1e2b0 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1e2c0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
1e2d0 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
1e2e0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1e2f0 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
1e300 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
1e310 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
1e320 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
1e330 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
1e340 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e350 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
1e360 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
1e370 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1e380 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
1e390 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
1e3a0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
1e3b0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1e3c0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1e3d0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1e3e0 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
1e3f0 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
1e400 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
1e410 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e420 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1e430 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1e440 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
1e450 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  g;..  assert( pa
1e460 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e470 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c  ) );.  pPg = sql
1e480 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1e490 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
1e4a0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
1e4b0 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
1e4c0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
1e4d0 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
1e4e0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1e4f0 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
1e500 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d  .      u32 iFram
1e510 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
1e520 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
1e530 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1e540 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26  al, pPg->pgno, &
1e550 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
1e560 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e570 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e580 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
1e590 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
1e5a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1e5b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e5c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1e5d0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1e5e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e5f0 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
1e600 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ull(pPg);.    }.
1e610 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1e620 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1e630 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1e640 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1e650 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1e660 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1e670 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1e680 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1e690 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1e6a0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1e6b0 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1e6c0 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1e6d0 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1e6e0 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1e6f0 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1e700 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1e710 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1e720 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1e730 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1e740 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1e750 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1e760 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1e770 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1e780 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1e790 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1e7a0 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1e7b0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1e7c0 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1e7d0 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1e7e0 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1e7f0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1e800 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1e810 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1e820 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e830 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e840 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1e850 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1e860 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1e870 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1e880 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1e890 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1e8a0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e8d0 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1e8e0 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1e8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e900 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1e910 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1e920 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1e930 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1e940 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1e950 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1e960 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1e970 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1e980 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1e990 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1e9a0 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1e9b0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1e9c0 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1e9d0 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1e9e0 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1e9f0 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1ea00 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1ea10 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1ea20 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1ea30 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1ea40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1ea50 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1ea60 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1ea70 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1ea80 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1ea90 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1eaa0 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1eab0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1eac0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1ead0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1eae0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1eaf0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1eb00 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1eb10 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1eb20 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1eb30 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1eb40 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1eb50 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1eb60 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1eb70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1eb80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1eb90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1eba0 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1ebb0 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1ebc0 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1ebd0 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1ebe0 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1ebf0 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1ec00 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1ec10 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1ec20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1ec30 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1ec40 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1ec50 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1ec60 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1ec70 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1ec80 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1ec90 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1eca0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1ecb0 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1ecc0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1ecd0 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1ece0 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1ecf0 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1ed00 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1ed10 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1ed20 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1ed30 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1ed40 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1ed50 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1ed60 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1ed70 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed90 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1eda0 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1edb0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1edc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1edd0 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1ede0 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1edf0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1ee20 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1ee30 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ee60 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1ee70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1ee80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ee90 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1eea0 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
1eeb0 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1eed0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1eee0 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
1eef0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1ef00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1ef10 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
1ef20 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1ef30 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1ef40 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1ef50 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1ef60 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1ef70 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1ef80 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ef90 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1efa0 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1efb0 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1efc0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1efd0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
1efe0 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
1eff0 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
1f000 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
1f010 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1f020 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
1f030 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
1f040 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
1f050 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
1f060 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1f070 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
1f080 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
1f090 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
1f0a0 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
1f0b0 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
1f0c0 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
1f0d0 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
1f0e0 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
1f0f0 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
1f100 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1f110 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1f120 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1f130 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1f140 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1f150 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1f160 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1f170 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1f180 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1f190 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1f1a0 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1f1b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1f1c0 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1f1d0 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1f1e0 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1f1f0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1f200 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1f210 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1f220 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1f230 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1f240 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1f250 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1f260 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1f270 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1f280 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1f290 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1f2a0 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1f2b0 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1f2c0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1f2d0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1f2e0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1f2f0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1f300 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1f310 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1f320 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1f330 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
1f340 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
1f350 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
1f360 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1f370 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
1f380 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1f390 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1f3a0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
1f3b0 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1f3c0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
1f3d0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1f3e0 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1f3f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1f400 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1f410 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1f420 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1f430 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f440 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1f450 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1f460 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1f470 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1f480 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1f490 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1f4a0 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1f4b0 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1f4c0 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1f4d0 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1f4e0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1f4f0 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1f500 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1f510 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1f520 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1f530 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1f540 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1f550 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1f560 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1f570 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f5a0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1f5b0 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1f5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1f5d0 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1f5e0 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
1f5f0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1f600 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1f610 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f620 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1f630 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
1f640 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
1f650 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
1f660 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1f670 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
1f680 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
1f690 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
1f6a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
1f6b0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
1f6c0 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
1f6d0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
1f6e0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
1f6f0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
1f700 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
1f710 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
1f720 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
1f730 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
1f740 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
1f750 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1f760 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1f770 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
1f780 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
1f790 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1f7a0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
1f7b0 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
1f7c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f7d0 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
1f7e0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1f7f0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
1f800 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
1f810 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
1f820 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
1f830 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
1f840 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1f850 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f860 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f870 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
1f880 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
1f890 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
1f8a0 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
1f8b0 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
1f8c0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f8d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1f8e0 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
1f8f0 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
1f900 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
1f910 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
1f920 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
1f930 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1f940 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1f950 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1f960 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f970 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
1f980 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
1f990 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
1f9a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
1f9b0 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
1f9c0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
1f9d0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1f9e0 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
1f9f0 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
1fa00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
1fa10 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1fa20 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
1fa30 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1fa40 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1fa50 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1fa60 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
1fa70 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
1fa80 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
1fa90 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
1faa0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
1fab0 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
1fac0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
1fad0 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
1fae0 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
1faf0 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
1fb00 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
1fb10 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1fb20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
1fb30 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
1fb40 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
1fb50 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
1fb60 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1fb70 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
1fb80 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
1fb90 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
1fba0 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
1fbb0 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
1fbc0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1fbd0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1fbe0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1fbf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fc00 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1fc10 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  OCK );.  nPage =
1fc20 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
1fc30 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
1fc40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 75  ..  /* If the nu
1fc50 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1fc60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1fc70 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
1fc80 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c  rom the.  ** WAL
1fc90 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65 74   sub-system, det
1fca0 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65 20  ermine the page 
1fcb0 63 6f 75 6e 74 65 20 62 61 73 65 64 20 6f 6e 20  counte based on 
1fcc0 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  the size of.  **
1fcd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fce0 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65  le.  If the size
1fcf0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fd00 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a   file is not an.
1fd10 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c    ** integer mul
1fd20 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
1fd30 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70  e-size, round up
1fd40 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
1fd50 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
1fd60 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   ){.    i64 n = 
1fd70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1fd80 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1fd90 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65   db file in byte
1fda0 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
1fdb0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1fdc0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1fdd0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1fde0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1fdf0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
1fe00 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
1fe10 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1fe20 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20  ->fd, &n);.     
1fe30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fe40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1fe50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1fe60 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
1fe70 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61   = (Pgno)((n+pPa
1fe80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  ger->pageSize-1)
1fe90 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1fea0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
1feb0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
1fec0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1fed0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
1fee0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
1fef0 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
1ff00 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
1ff10 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
1ff20 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
1ff30 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
1ff40 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
1ff50 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
1ff60 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
1ff70 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1ff80 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
1ff90 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
1ffa0 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
1ffb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ffc0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
1ffd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1ffe0 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
1fff0 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
20000 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
20010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
20020 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
20030 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
20040 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20050 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
20060 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
20070 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
20080 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
20090 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
200a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
200b0 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
200c0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
200d0 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
200e0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
200f0 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
20100 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
20110 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
20120 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
20130 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
20140 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
20150 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
20160 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
20170 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
20180 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
20190 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
201a0 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
201b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
201c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
201d0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
201e0 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
201f0 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
20200 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
20210 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
20220 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
20230 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
20240 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
20250 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
20260 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
20270 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
20280 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
20290 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
202a0 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
202b0 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
202c0 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
202d0 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
202e0 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
202f0 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
20300 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
20310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
20320 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
20330 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
20340 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
20350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
20360 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
20370 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
20380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20390 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
203a0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  ED_LOCK );..  if
203b0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
203c0 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
203d0 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
203e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
203f0 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
20400 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  sts */.    Pgno 
20410 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
20420 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20430 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20440 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63   file */..    rc
20450 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
20460 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
20470 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
20480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
20490 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
204a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
204b0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
204c0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
204d0 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zWal, 0);.      
204e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
204f0 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
20500 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
20510 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  OK;.      isWal 
20520 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
20530 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20540 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
20550 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
20560 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
20570 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
20580 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
20590 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
205a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
205b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
205c0 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
205d0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
205e0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
205f0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
20600 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
20610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20620 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
20630 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, 0);.      }el
20640 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
20650 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
20660 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
20670 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
20680 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20690 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
206a0 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
206b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
206c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
206d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
206e0 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
206f0 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
20700 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
20710 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
20720 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
20730 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
20740 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
20750 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
20760 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
20770 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
20780 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
20790 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
207a0 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
207b0 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
207c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
207d0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
207e0 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
207f0 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
20800 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
20810 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
20820 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
20830 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
20840 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
20850 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
20860 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
20870 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
20880 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
20890 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
208a0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
208b0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
208c0 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
208d0 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
208e0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
208f0 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
20900 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
20910 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
20920 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
20930 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
20940 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
20950 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20960 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
20970 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
20980 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20990 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
209a0 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
209b0 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
209c0 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
209d0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
209e0 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
209f0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
20a00 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
20a10 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20a20 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
20a30 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20a40 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
20a50 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
20a60 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
20a70 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
20a80 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
20a90 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
20aa0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
20ab0 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
20ac0 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
20ad0 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
20ae0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
20af0 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
20b00 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
20b10 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
20b20 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
20b30 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
20b40 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
20b50 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
20b60 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
20b70 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
20b80 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
20b90 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
20ba0 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
20bb0 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
20bc0 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
20bd0 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
20be0 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
20bf0 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
20c00 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
20c10 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
20c20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
20c30 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
20c40 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
20c50 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
20c60 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
20c70 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
20c80 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
20c90 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
20ca0 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
20cb0 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
20cc0 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
20cd0 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
20ce0 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
20cf0 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
20d00 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
20d10 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
20d20 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
20d30 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
20d40 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
20d50 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
20d60 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
20d70 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
20d80 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
20d90 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
20da0 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
20db0 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
20dc0 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
20dd0 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
20de0 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
20df0 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
20e00 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
20e10 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
20e20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
20e30 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
20e40 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
20e50 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
20e60 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
20e70 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
20e80 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
20e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
20ea0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
20eb0 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
20ec0 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
20ed0 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
20ee0 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
20ef0 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
20f00 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
20f10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
20f20 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
20f30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20f40 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
20f50 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
20f60 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
20f70 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
20f80 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
20f90 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
20fa0 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
20fb0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
20fc0 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
20fd0 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
20fe0 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
20ff0 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
21000 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
21010 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
21020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
21030 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61  * Set the databa
21040 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20  se size back to 
21050 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73  the value it was
21060 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65   before the save
21070 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e  point .  ** bein
21080 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f  g reverted was o
21090 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
210a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
210b0 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76  Savepoint ? pSav
210c0 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20  epoint->nOrig : 
210d0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
210e0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  ze;.  pPager->ch
210f0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
21100 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
21110 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
21120 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
21130 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
21140 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
21150 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
21160 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
21170 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
21180 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
21190 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
211a0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
211b0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
211c0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
211d0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
211e0 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
211f0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
21200 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
21210 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21220 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
21230 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
21240 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
21250 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
21260 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
21270 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
21280 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
21290 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
212a0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
212b0 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
212c0 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
212d0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
212e0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
212f0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
21300 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
21310 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
21320 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
21330 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
21340 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
21350 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
21360 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
21370 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
21380 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
21390 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
213a0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
213b0 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
213c0 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
213d0 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
213e0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
213f0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
21400 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
21410 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
21420 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
21430 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
21440 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
21450 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21460 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
21470 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
21480 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
21490 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
214a0 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
214b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
214c0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
214d0 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
214e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
214f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21500 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
21510 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
21520 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
21530 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
21540 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
21550 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
21560 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
21570 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
21580 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
21590 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
215a0 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
215b0 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
215c0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
215d0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
215e0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
215f0 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
21600 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
21610 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
21620 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
21630 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
21640 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
21650 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
21660 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
21670 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
21680 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
21690 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
216a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
216b0 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
216c0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
216d0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
216e0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
216f0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
21700 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21710 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
21720 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
21730 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
21740 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
21750 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
21760 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
21770 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
21780 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
21790 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
217a0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
217b0 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
217c0 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
217d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
217e0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
217f0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
21800 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
21810 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
21820 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
21830 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
21840 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
21850 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
21860 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
21870 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
21880 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
21890 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
218a0 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
218b0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
218c0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
218d0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
218e0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
218f0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
21900 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
21910 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
21920 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
21930 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
21940 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
21950 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
21960 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
21970 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
21980 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
21990 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
219a0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
219b0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
219c0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
219d0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
219e0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
219f0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
21a00 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21a10 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
21a20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
21a30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
21a40 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
21a50 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
21a60 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
21a70 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
21a80 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
21a90 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
21aa0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
21ab0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
21ac0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
21ad0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
21ae0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
21af0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
21b00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
21b10 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
21b20 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
21b30 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21b40 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
21b50 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65  set = (i64)pSave
21b60 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28  point->iSubRec*(
21b70 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
21b80 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  ze);..    if( pa
21b90 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
21ba0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
21bb0 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f  sqlite3WalSavepo
21bc0 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  intUndo(pPager->
21bd0 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74  pWal, pSavepoint
21be0 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20  ->aWalData);.   
21bf0 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53   }.    for(ii=pS
21c00 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
21c10 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
21c20 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e   && ii<pPager->n
21c30 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20  SubRec; ii++){. 
21c40 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
21c50 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b  set==(i64)ii*(4+
21c60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21c70 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
21c80 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
21c90 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
21ca0 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20  &offset, pDone, 
21cb0 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 1);.    }.   
21cc0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21cd0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
21ce0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
21cf0 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a  Destroy(pDone);.
21d00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21d10 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
21d20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
21d30 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  szJ;.  }..  retu
21d40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21d50 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
21d60 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
21d70 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
21d80 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  t are allowed.**
21d90 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
21da0 6e 67 20 74 6f 20 72 65 63 79 63 6c 65 20 63 6c  ng to recycle cl
21db0 65 61 6e 20 61 6e 64 20 75 6e 75 73 65 64 20 70  ean and unused p
21dc0 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ages..*/.void sq
21dd0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
21de0 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
21df0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
21e00 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
21e10 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  heSetCachesize(p
21e20 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
21e30 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
21e40 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
21e50 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
21e60 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
21e70 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a  hat are allowed.
21e80 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ** before attemp
21e90 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70 61  ting to spill pa
21ea0 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a  ges to journal..
21eb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
21ec0 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28  gerSetSpillsize(
21ed0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
21ee0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65  nt mxPage){.  re
21ef0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
21f00 68 65 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70  heSetSpillsize(p
21f10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
21f20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
21f30 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f  * Invoke SQLITE_
21f40 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20  FCNTL_MMAP_SIZE 
21f50 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72  based on the cur
21f60 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a  rent value of sz
21f70 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Mmap..*/.static 
21f80 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61 70  void pagerFixMap
21f90 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  limit(Pager *pPa
21fa0 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  ger){.#if SQLITE
21fb0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
21fc0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
21fd0 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64  *fd = pPager->fd
21fe0 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66  ;.  if( isOpen(f
21ff0 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f  d) && fd->pMetho
22000 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20  ds->iVersion>=3 
22010 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
22020 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20  nt64 sz;.    sz 
22030 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70  = pPager->szMmap
22040 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55  ;.    pPager->bU
22050 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29  seFetch = (sz>0)
22060 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
22070 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
22080 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
22090 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
220a0 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e  E, &sz);.  }.#en
220b0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dif.}../*.** Cha
220c0 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
220d0 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f  size of any memo
220e0 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20  ry mapping made 
220f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22100 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
22110 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
22120 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  pLimit(Pager *pP
22130 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ager, sqlite3_in
22140 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70  t64 szMmap){.  p
22150 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
22160 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46  szMmap;.  pagerF
22170 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
22180 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
22190 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
221a0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
221b0 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  m the pager..*/.
221c0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
221d0 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70  rShrink(Pager *p
221e0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
221f0 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50  3PcacheShrink(pP
22200 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
22210 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
22220 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20  settings of the 
22230 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73  pager to those s
22240 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
22250 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  pgFlags paramete
22260 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65  r..**.** The "le
22270 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20  vel" in pgFlags 
22280 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  & PAGER_SYNCHRON
22290 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68  OUS_MASK sets th
222a0 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20  e robustness.** 
222b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
222c0 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
222d0 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20 70   OS crashes or p
222e0 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
222f0 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65  .** changing the
22300 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
22310 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
22320 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   the journals..*
22330 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  * There are thre
22340 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
22350 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
22360 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
22370 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
22380 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
22390 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
223a0 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
223b0 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
223c0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
223d0 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
223e0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
223f0 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
22400 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
22410 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
22420 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
22430 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
22440 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
22450 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
22460 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
22470 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
22480 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
22490 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
224a0 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
224b0 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
224c0 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
224d0 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
224e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
224f0 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
22500 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
22510 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
22520 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
22530 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
22540 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
22550 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
22560 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
22570 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
22580 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
22590 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
225a0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
225b0 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
225c0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
225d0 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
225e0 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
225f0 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
22600 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
22610 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
22620 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
22630 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
22640 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
22650 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
22660 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22670 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
22680 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
22690 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
226a0 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
226b0 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
226c0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
226d0 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
226e0 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
226f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
22700 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
22710 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
22720 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
22730 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
22740 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61  e above is for a
22750 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
22760 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c  l mode.  For WAL
22770 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69   mode, OFF conti
22780 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20  nues.** to mean 
22790 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76  that no syncs ev
227a0 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41  er occur.  NORMA
227b0 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
227c0 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a   WAL is synced.*
227d0 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  * prior to the s
227e0 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69  tart of checkpoi
227f0 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  nt and that the 
22800 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
22810 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68   synced.** at th
22820 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
22830 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
22840 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  f the entire con
22850 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a  tent of the WAL.
22860 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62  ** was written b
22870 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
22880 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73  abase.  But no s
22890 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ync operations o
228a0 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f  ccur for.** an o
228b0 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69  rdinary commit i
228c0 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69  n NORMAL mode wi
228d0 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65  th WAL.  FULL me
228e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
228f0 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63  .** file is sync
22900 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ed following eac
22910 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69  h commit operati
22920 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  on, in addition 
22930 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20  to the.** syncs 
22940 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22950 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f  NORMAL..**.** Do
22960 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e   not confuse syn
22970 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69  chronous=FULL wi
22980 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  th SQLITE_SYNC_F
22990 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  ULL.  The.** SQL
229a0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61  ITE_SYNC_FULL ma
229b0 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65  cro means to use
229c0 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c   the MacOSX-styl
229d0 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20  e full-fsync.** 
229e0 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55  using fcntl(F_FU
229f0 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54  LLFSYNC).  SQLIT
22a00 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65  E_SYNC_NORMAL me
22a10 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20  ans to do an.** 
22a20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29  ordinary fsync()
22a30 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73   call.  There is
22a40 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
22a50 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59  etween SQLITE_SY
22a60 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53  NC_FULL.** and S
22a70 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22a80 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f  L on platforms o
22a90 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58  ther than MacOSX
22aa0 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79  .  But the.** sy
22ab0 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76  nchronous=FULL v
22ac0 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75  ersus synchronou
22ad0 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67  s=NORMAL setting
22ae0 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e   determines when
22af0 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72  .** the xSync pr
22b00 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65  imitive is calle
22b10 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e  d and is relevan
22b20 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72  t to all platfor
22b30 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ms..**.** Numeri
22b40 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
22b50 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
22b60 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
22b70 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
22b80 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
22b90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22ba0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
22bb0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22bc0 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67  rSetFlags(.  Pag
22bd0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
22be0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
22bf0 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
22c00 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73  vel for */.  uns
22c10 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
22c20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c     /* Various fl
22c30 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  ags */.){.  unsi
22c40 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46  gned level = pgF
22c50 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e  lags & PAGER_SYN
22c60 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20  CHRONOUS_MASK;. 
22c70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
22c80 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
22c90 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
22ca0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
22cb0 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  lSync = 0;.    p
22cc0 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
22cd0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
22ce0 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
22cf0 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45  c =  level==PAGE
22d00 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46  R_SYNCHRONOUS_OF
22d10 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67  F ?1:0;.    pPag
22d20 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
22d30 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43  evel>=PAGER_SYNC
22d40 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a  HRONOUS_FULL ?1:
22d50 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
22d60 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c  xtraSync = level
22d70 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  ==PAGER_SYNCHRON
22d80 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a  OUS_EXTRA ?1:0;.
22d90 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
22da0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
22db0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22dc0 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  s = 0;.    pPage
22dd0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22de0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
22df0 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
22e00 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  R_FULLFSYNC ){. 
22e10 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22e20 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22e30 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61  NC_FULL;.    pPa
22e40 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22e50 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22e60 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69  _FULL;.  }else i
22e70 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
22e80 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
22e90 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  C ){.    pPager-
22ea0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
22eb0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
22ec0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
22ed0 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
22ee0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
22ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
22f00 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22f10 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22f20 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
22f30 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
22f40 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22f50 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  AL;.  }.  pPager
22f60 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
22f70 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22f80 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  gs;.  if( pPager
22f90 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
22fa0 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
22fb0 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59  cFlags |= WAL_SY
22fc0 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b  NC_TRANSACTIONS;
22fd0 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61  .  }.  if( pgFla
22fe0 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45  gs & PAGER_CACHE
22ff0 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61  SPILL ){.    pPa
23000 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
23010 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  &= ~SPILLFLAG_OF
23020 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  F;.  }else{.    
23030 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
23040 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
23050 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  OFF;.  }.}.#endi
23060 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
23070 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
23080 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
23090 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
230a0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
230b0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
230c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
230d0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
230e0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
230f0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
23100 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
23110 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
23120 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
23130 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
23140 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
23150 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
23160 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
23170 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
23180 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
23190 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
231a0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
231b0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
231c0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
231d0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
231e0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
231f0 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
23200 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
23210 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
23220 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
23230 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
23240 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
23250 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
23260 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
23270 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
23280 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
23290 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
232a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
232b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
232c0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
232d0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
232e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
232f0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
23300 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
23310 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
23320 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
23330 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
23340 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
23350 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
23360 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
23370 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
23380 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
23390 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
233a0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
233b0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
233c0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
233d0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
233e0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
233f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23400 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
23410 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
23420 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
23430 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
23440 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
23450 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
23460 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
23470 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
23480 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
23490 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
234a0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
234b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
234c0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
234d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
234e0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
234f0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
23500 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
23510 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
23520 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
23530 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
23540 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
23550 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23560 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
23570 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
23580 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
23590 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
235a0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
235b0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
235c0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
235d0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
235e0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
235f0 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
23600 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
23610 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
23620 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
23630 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
23640 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
23650 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
23660 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
23670 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
23680 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
23690 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
236a0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
236b0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
236c0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
236d0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
236e0 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
236f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
23700 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
23710 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
23720 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
23730 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
23740 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
23750 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
23760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
23790 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
237a0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
237b0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
237c0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
237d0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
237e0 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
237f0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
23800 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
23810 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
23820 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
23830 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
23840 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
23850 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
23860 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
23870 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
23880 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
23890 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
238a0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
238b0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
238c0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
238d0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
238e0 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
238f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
23900 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
23910 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
23920 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
23950 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
23960 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
23970 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
23980 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
23990 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
239a0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
239b0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
239c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
239d0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
239e0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
239f0 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  .){.  pPager->xB
23a00 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
23a10 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
23a20 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
23a30 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
23a40 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69  lerArg;..  if( i
23a50 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
23a60 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a  ) ){.    void **
23a70 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70  ap = (void **)&p
23a80 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
23a90 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ler;.    assert(
23aa0 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a   ((int(*)(void *
23ab0 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73  ))(ap[0]))==xBus
23ac0 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20  yHandler );.    
23ad0 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70  assert( ap[1]==p
23ae0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29  BusyHandlerArg )
23af0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
23b00 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
23b10 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
23b20 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44  E_FCNTL_BUSYHAND
23b30 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29  LER, (void *)ap)
23b40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
23b50 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
23b60 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
23b70 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
23b80 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
23b90 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
23ba0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
23bb0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
23bc0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
23bd0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
23be0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
23bf0 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
23c00 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
23c10 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
23c20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
23c30 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
23c40 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
23c50 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f  OERR, an SQLITE_
23c60 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f  IOERR_xxx sub-co
23c70 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  de or SQLITE_FUL
23c80 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
23c90 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
23ca0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
23cb0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
23cc0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
23cd0 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
23ce0 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
23cf0 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
23d00 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
23d10 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
23d20 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
23d30 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
23d40 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
23d50 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
23d60 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
23d70 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
23d80 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
23d90 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
23da0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
23db0 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
23dc0 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
23dd0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
23de0 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
23df0 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
23e00 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
23e10 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
23e20 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
23e30 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
23e40 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
23e50 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
23e60 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
23e70 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
23e80 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
23e90 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
23ea0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
23eb0 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
23ec0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
23ed0 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
23ee0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
23ef0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
23f00 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
23f10 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
23f20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
23f30 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
23f40 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
23f50 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
23f60 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
23f70 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
23f80 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
23f90 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
23fa0 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
23fb0 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
23fc0 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
23fd0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
23fe0 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
23ff0 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
24000 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
24010 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
24020 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
24030 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
24040 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
24050 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
24060 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
24070 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
24080 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
24090 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
240a0 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
240b0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
240c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
240d0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20  TE_OK;..  /* It 
240e0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
240f0 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
24100 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
24110 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
24120 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
24130 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
24140 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
24150 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
24160 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
24170 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
24180 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
24190 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  sistent..  **.  
241a0 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  ** At one point 
241b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
241c0 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
241d0 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  if the pager was
241e0 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f   in .  ** PAGER_
241f0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74  ERROR state. But
24200 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52   since PAGER_ERR
24210 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74  OR state guarant
24220 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ees that.  ** th
24230 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ere is at least 
24240 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
24250 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20  page reference, 
24260 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
24270 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ** is a no-op fo
24280 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68  r that case anyh
24290 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20  ow..  */..  u32 
242a0 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
242b0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
242c0 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
242d0 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
242e0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
242f0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
24300 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  ) );.  if( (pPag
24310 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
24320 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
24330 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  0).   && sqlite3
24340 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
24350 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
24360 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69  =0 .   && pageSi
24370 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
24380 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
24390 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  eSize .  ){.    
243a0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c  char *pNew = NUL
243b0 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  L;             /
243c0 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65  * New temp space
243d0 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74   */.    i64 nByt
243e0 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
243f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
24400 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
24410 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
24420 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
24430 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
24440 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79  pPager->fd, &nBy
24450 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  te);.    }.    i
24460 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24470 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
24480 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
24490 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
244a0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
244b0 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c  !pNew ) rc = SQL
244c0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
244d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
244e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
244f0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
24500 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
24510 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
24520 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
24530 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
24540 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
24550 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24570 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
24580 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
24590 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
245a0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
245b0 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ew;.      pPager
245c0 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
245d0 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
245e0 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
245f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
24600 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
24610 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
24620 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
24630 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
24640 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
24650 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
24660 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
24670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24680 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
24690 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
246a0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
246b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
246c0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
246d0 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
246e0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
246f0 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
24700 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
24710 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
24720 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
24730 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
24740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24750 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
24760 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
24770 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
24780 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
24790 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
247a0 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
247b0 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
247c0 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
247d0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
247e0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
247f0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
24800 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
24810 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
24820 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
24830 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
24840 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
24850 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
24860 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
24870 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
24880 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
24890 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
248a0 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
248b0 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
248c0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
248d0 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
248e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
248f0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
24900 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
24910 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
24920 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
24930 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
24940 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
24950 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
24960 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
24970 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
24980 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
24990 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
249a0 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
249b0 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
249c0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
249d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
249e0 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
249f0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
24a00 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
24a10 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
24a20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24a30 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
24a40 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
24a50 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
24a60 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
24a70 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
24a80 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
24a90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24aa0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
24ab0 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
24ac0 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
24ad0 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
24ae0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24af0 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
24b00 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
24b10 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
24b20 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
24b30 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
24b40 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
24b50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
24b60 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
24b70 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
24b80 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
24b90 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
24ba0 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
24bb0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
24bc0 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
24bd0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
24be0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
24bf0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
24c00 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
24c10 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
24c20 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
24c30 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
24c40 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
24c50 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
24c60 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
24c70 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
24c80 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
24c90 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
24ca0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
24cb0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
24cc0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
24cd0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
24ce0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24cf0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
24d00 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
24d10 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24d20 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
24d30 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24d40 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
24d50 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
24d60 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
24d70 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
24d80 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
24d90 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
24da0 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
24db0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24dc0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
24dd0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
24de0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
24df0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
24e00 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
24e10 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
24e20 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
24e30 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
24e40 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
24e50 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
24e60 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
24e70 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
24e80 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
24e90 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
24ea0 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
24eb0 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
24ec0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
24ed0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
24ee0 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
24ef0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
24f00 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
24f10 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
24f20 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
24f30 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
24f40 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
24f50 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
24f60 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
24f70 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
24f80 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
24f90 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
24fa0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
24fb0 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
24fc0 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
24fd0 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
24fe0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
24ff0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
25000 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
25010 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
25020 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
25030 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
25040 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
25050 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
25060 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25070 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
25080 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25090 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
250a0 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
250b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
250c0 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
250d0 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
250e0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
250f0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
25100 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
25110 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
25120 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
25130 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
25140 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
25150 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
25160 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
25170 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
25180 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
25190 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
251a0 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
251b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
251c0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
251d0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
251e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
251f0 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
25200 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
25210 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
25220 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
25230 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
25240 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
25250 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
25260 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
25270 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
25280 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25290 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
252a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
252b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
252c0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
252d0 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
252e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
252f0 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
25300 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
25310 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
25320 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
25330 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
25340 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
25350 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
25360 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
25370 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
25380 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
25390 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
253a0 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
253b0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
253c0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
253d0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
253e0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
253f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
25400 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
25410 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25420 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
25430 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
25440 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
25450 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
25460 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
25470 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
25480 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
25490 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
254a0 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
254b0 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
254c0 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
254d0 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
254e0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
254f0 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
25500 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
25510 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
25520 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
25530 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
25540 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
25550 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
25560 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
25570 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
25580 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
25590 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
255a0 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
255b0 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
255c0 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
255d0 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
255e0 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
255f0 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
25600 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
25610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
25620 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
25630 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
25640 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
25650 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
25660 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
25670 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
25680 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
25690 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
256a0 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
256b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
256c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
256d0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
256e0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
256f0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
25700 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25720 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25730 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
25740 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
25750 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
25760 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
25770 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
25780 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
25790 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  eld), or one of 
257a0 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  the transitions 
257b0 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
257c0 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
257d0 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
257e0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
257f0 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
25800 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
25810 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
25820 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
25830 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
25840 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
25850 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
25860 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
25870 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
25880 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
25890 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
258a0 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
258b0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
258c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
258d0 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
258e0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
258f0 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
25900 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
25910 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
25920 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
25930 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
25940 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
25950 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25960 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
25970 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25980 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
25990 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
259a0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
259b0 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
259c0 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
259d0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
259e0 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
259f0 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
25a00 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
25a10 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
25a20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
25a30 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
25a40 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
25a50 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
25a60 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
25a70 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
25a80 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
25a90 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
25aa0 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
25ab0 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
25ac0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
25ad0 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
25ae0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
25af0 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
25b00 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
25b10 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
25b20 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
25b30 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
25b40 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
25b50 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
25b60 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
25b70 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
25b80 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
25b90 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
25ba0 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
25bb0 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
25bc0 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
25bd0 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
25be0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
25bf0 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
25c00 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
25c10 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
25c20 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
25c30 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
25c40 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
25c50 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
25c60 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f  rect behavior wo
25c70 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
25c80 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
25c90 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
25ca0 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
25cb0 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
25cc0 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
25cd0 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
25ce0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25cf0 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
25d00 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
25d10 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
25d20 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
25d30 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
25d40 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
25d50 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
25d60 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
25d70 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
25d80 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
25d90 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
25da0 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
25db0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
25dc0 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
25dd0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
25de0 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
25df0 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
25e00 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
25e10 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
25e20 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
25e30 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
25e40 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
25e50 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
25e60 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
25e70 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
25e80 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
25e90 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
25ea0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
25eb0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25ec0 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
25ed0 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
25ee0 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
25ef0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25f00 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
25f10 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
25f20 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25f30 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
25f40 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
25f50 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
25f60 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
25f70 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
25f80 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
25f90 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
25fa0 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
25fb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25fc0 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
25fd0 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
25fe0 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
25ff0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
26000 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
26010 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
26020 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
26030 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
26040 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
26050 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
26060 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
26070 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26080 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26090 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
260a0 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74   Once this funct
260b0 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ion has been cal
260c0 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63  led, the transac
260d0 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72  tion must either
260e0 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61   be.** rolled ba
260f0 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e  ck or committed.
26100 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
26110 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
26120 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65  ction and.** the
26130 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69  n continue writi
26140 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
26150 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
26160 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
26170 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
26180 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
26190 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
261a0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
261b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
261c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
261d0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
261e0 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
261f0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
26200 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70  ;..  /* At one p
26210 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65  oint the code he
26220 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74  re called assert
26230 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26240 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73  nt() to.  ** ens
26250 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ure that all pag
26260 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  es being truncat
26270 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20  ed away by this 
26280 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20  operation are,. 
26290 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f   ** if one or mo
262a0 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  re savepoints ar
262b0 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20  e open, present 
262c0 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  in the savepoint
262d0 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73   .  ** journal s
262e0 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
262f0 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74  be restored if t
26300 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
26310 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
26320 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  . This is no lon
26330 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73  ger necessary as
26340 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26350 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20  s now only.  ** 
26360 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26370 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26380 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
26390 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20   although the . 
263a0 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   ** Pager object
263b0 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20   may still have 
263c0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
263d0 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
263e0 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65  t!=0), .  ** the
263f0 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  y cannot be roll
26400 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20  ed back. So the 
26410 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26420 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a  nstraint() call.
26430 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65    ** is no longe
26440 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a  r correct. */.}.
26450 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26460 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
26470 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
26480 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
26490 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
264a0 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
264b0 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
264c0 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
264d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
264e0 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
264f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26500 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
26510 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
26520 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
26530 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
26540 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
26550 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
26560 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
26570 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
26580 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
26590 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
265a0 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
265b0 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
265c0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
265d0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
265e0 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
265f0 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
26600 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
26610 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
26620 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
26630 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
26640 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
26650 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
26660 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
26670 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
26680 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
26690 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
266a0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
266b0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
266c0 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
266d0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
266e0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
266f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
26700 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
26710 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
26720 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
26730 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
26740 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
26750 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
26760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
26770 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
26780 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
26790 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
267a0 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
267b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
267c0 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
267d0 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79  ence to a memory
267e0 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a   mapped page obj
267f0 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  ect for page num
26800 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68  ber pgno. .** Th
26810 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
26820 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65  l use the pointe
26830 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65  r pData, obtaine
26840 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e  d from xFetch().
26850 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
26860 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20 74  l, set *ppPage t
26870 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
26880 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ew page referenc
26890 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  e.** and return 
268a0 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
268b0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
268c0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
268d0 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70  e and set.** *pp
268e0 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  Page to zero..**
268f0 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e  .** Page referen
26900 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  ces obtained by 
26910 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
26920 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
26930 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63  released.** by c
26940 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65  alling pagerRele
26950 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  aseMapPage()..*/
26960 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26970 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
26980 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
26990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
269a0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
269b0 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ct */.  Pgno pgn
269c0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
269d0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
269e0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64  number */.  void
269f0 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
26a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
26a10 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20 66  Fetch()'d data f
26a20 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
26a30 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65    PgHdr **ppPage
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72    /* OUT: Acquir
26a60 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a  ed page object *
26a70 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  /.){.  PgHdr *p;
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a90 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
26aa0 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f 20   mapped page to 
26ab0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69  return */.  .  i
26ac0 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  f( pPager->pMmap
26ad0 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20  Freelist ){.    
26ae0 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50  *ppPage = p = pP
26af0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26b00 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ist;.    pPager-
26b10 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
26b20 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
26b30 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
26b40 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78     memset(p->pEx
26b50 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  tra, 0, pPager->
26b60 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65  nExtra);.  }else
26b70 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
26b80 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c  p = (PgHdr *)sql
26b90 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
26ba0 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70  izeof(PgHdr) + p
26bb0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
26bc0 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
26bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
26be0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
26bf0 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
26c00 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
26c10 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
26c20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26c30 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
26c40 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
26c50 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
26c60 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
26c70 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
26c80 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
26c90 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
26ca0 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
26cb0 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
26cc0 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
26cd0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
26ce0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
26cf0 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
26d00 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
26d10 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
26d20 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
26d30 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
26d40 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
26d50 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
26d60 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
26d70 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
26d80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26d90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
26da0 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
26db0 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70  e to page pPg. p
26dc0 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  Pg must have bee
26dd0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  n returned by an
26de0 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c   .** earlier cal
26df0 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72  l to pagerAcquir
26e00 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  eMapPage()..*/.s
26e10 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
26e20 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50  ReleaseMapPage(P
26e30 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
26e40 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
26e50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61  g->pPager;.  pPa
26e60 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b  ger->nMmapOut--;
26e70 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
26e80 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26e90 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72  eelist;.  pPager
26ea0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
26eb0 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74  = pPg;..  assert
26ec0 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
26ed0 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
26ee0 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=3 );.  sqlite3
26ef0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
26f00 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d  ->fd, (i64)(pPg-
26f10 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  >pgno-1)*pPager-
26f20 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e  >pageSize, pPg->
26f30 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pData);.}../*.**
26f40 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20   Free all PgHdr 
26f50 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69  objects stored i
26f60 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61  n the Pager.pMma
26f70 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a  pFreelist list..
26f80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
26f90 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
26fa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26fb0 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67    PgHdr *p;.  Pg
26fc0 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Hdr *pNext;.  fo
26fd0 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61  r(p=pPager->pMma
26fe0 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d  pFreelist; p; p=
26ff0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
27000 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
27010 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27020 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  p);.  }.}.../*.*
27030 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
27040 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
27050 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
27060 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
27070 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
27080 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
27090 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
270a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
270b0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
270c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
270d0 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
270e0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
270f0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
27100 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
27110 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
27120 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
27130 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
27140 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
27150 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
27160 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
27170 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
27180 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
27190 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
271a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
271b0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
271c0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
271d0 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
271e0 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
271f0 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
27200 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
27210 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
27220 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
27230 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
27240 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
27250 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
27260 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
27270 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
27280 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
27290 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
272a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
272b0 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
272c0 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
272d0 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ace;..  assert( 
272e0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
272f0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
27300 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
27310 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
27320 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
27330 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
27340 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
27350 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
27360 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
27370 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
27380 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
27390 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
273a0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
273b0 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
273c0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65  ger->pWal, pPage
273d0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
273e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
273f0 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61  ze, pTmp);.  pPa
27400 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
27410 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
27420 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
27430 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
27440 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
27450 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
27460 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
27470 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
27480 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
27490 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
274a0 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
274b0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
274c0 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
274d0 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
274e0 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
274f0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
27500 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
27510 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
27520 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
27530 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
27540 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
27550 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
27560 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
27570 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
27580 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
27590 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
275a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
275b0 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
275c0 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
275d0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
275e0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
275f0 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
27600 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
27610 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
27620 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
27630 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
27640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
27650 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
27660 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
27670 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
27680 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
27690 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
276a0 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
276b0 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
276c0 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
276d0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
276e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
276f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
27700 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27710 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
27720 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
27730 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
27740 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
27750 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
27760 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
27770 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
27780 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
27790 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
277a0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
277b0 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
277c0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
277d0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
277e0 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
277f0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
27800 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
27810 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
27820 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
27830 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
27840 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
27850 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
27860 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
27870 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
27880 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
27890 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
278a0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
278b0 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
278c0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
278d0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
278e0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
278f0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
27900 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
27910 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
27920 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
27930 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
27940 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
27950 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
27960 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
27970 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27980 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
27990 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
279a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
279b0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
279c0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
279d0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
279e0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
279f0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
27a00 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
27a10 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
27a20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
27a30 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
27a40 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
27a50 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
27a60 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
27a70 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
27a80 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
27a90 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
27aa0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
27ab0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
27ac0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
27ad0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
27ae0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
27af0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
27b00 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
27b10 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
27b20 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
27b30 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
27b40 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
27b50 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
27b60 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
27b70 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
27b80 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
27b90 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
27ba0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27bb0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
27bc0 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
27bd0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
27be0 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
27bf0 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
27c00 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
27c10 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
27c20 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
27c30 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
27c40 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
27c50 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
27c60 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
27c70 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
27c80 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
27c90 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
27ca0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
27cb0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
27cc0 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
27cd0 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
27ce0 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
27cf0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
27d00 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
27d10 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
27d20 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
27d30 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
27d40 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
27d50 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
27d60 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
27d70 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
27d80 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
27d90 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
27da0 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
27db0 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
27dc0 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
27dd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27de0 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
27df0 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
27e00 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
27e10 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
27e20 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27e30 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
27e40 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
27e50 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
27e60 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
27e70 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
27e80 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
27e90 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
27ea0 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
27eb0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
27ec0 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
27ed0 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
27ee0 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
27ef0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
27f00 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
27f10 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
27f20 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
27f30 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
27f40 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
27f50 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
27f60 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63    }.**.** If suc
27f70 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
27f80 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
27f90 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
27fa0 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
27fb0 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
27fc0 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
27fd0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27fe0 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
27ff0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
28000 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
28010 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
28020 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
28030 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
28040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
28050 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
28060 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65   *pPager, int ne
28070 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  wHdr){.  int rc;
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28090 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
280a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
280b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
280c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
280d0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
280e0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
280f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
28100 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
28110 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
28120 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
28130 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28140 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
28150 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ger) );..  rc = 
28160 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
28170 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
28180 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
28190 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
281a0 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
281b0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
281c0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
281d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
281e0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
281f0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
28200 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
28210 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
28220 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
28230 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
28240 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
28250 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
28260 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
28270 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
28280 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
28290 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
282a0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
282b0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
282c0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
282d0 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
282e0 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
282f0 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
28300 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
28310 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
28320 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
28330 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
28340 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
28350 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
28360 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
28370 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
28380 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
28390 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
283a0 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
283b0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
283c0 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
283d0 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
283e0 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
283f0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
28400 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
28410 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
28420 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
28430 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
28440 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
28450 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
28460 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
28470 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
28480 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
28490 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
284a0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
284b0 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
284c0 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
284d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
284e0 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
284f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
28500 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
28510 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
28520 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
28530 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
28540 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
28550 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
28560 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
28570 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
28580 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
28590 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
285a0 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
285b0 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
285c0 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
285d0 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
285e0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
285f0 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
28600 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
28610 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
28620 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
28630 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
28640 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
28650 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
28660 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
28670 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
28680 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
28690 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
286a0 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
286b0 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
286c0 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
286d0 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
286e0 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
286f0 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
28700 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
28710 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
28720 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28730 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
28740 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
28750 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
28760 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
28770 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
28780 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
28790 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
287a0 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
287b0 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
287c0 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
287d0 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
287e0 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
287f0 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
28800 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
28810 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
28820 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
28830 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
28840 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
28850 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
28860 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
28870 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
28880 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
28890 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
288a0 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
288b0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
288c0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
288d0 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
288e0 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
288f0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
28900 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
28910 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
28920 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
28930 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
28940 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28960 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
28970 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
28980 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
28990 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
289a0 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
289b0 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
289c0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
289d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
289e0 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
289f0 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
28a00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28a10 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28a20 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
28a30 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
28a40 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
28a50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28a60 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
28a70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
28a80 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
28a90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28aa0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28ab0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
28ac0 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
28ad0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28ae0 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
28af0 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
28b00 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
28b10 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
28b20 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
28b30 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
28b40 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
28b50 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
28b60 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
28b70 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
28b80 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
28b90 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
28ba0 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
28bb0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28bc0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
28bd0 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
28be0 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
28bf0 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
28c00 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
28c10 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
28c20 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
28c30 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
28c40 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
28c50 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
28c60 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
28c70 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
28c80 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
28c90 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
28ca0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
28cb0 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
28cc0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
28cd0 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
28ce0 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
28cf0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
28d00 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
28d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
28d20 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
28d30 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28d40 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
28d50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
28d60 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
28d70 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
28d80 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28d90 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
28da0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
28db0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
28dc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28dd0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
28de0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
28df0 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
28e00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28e10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28e20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
28e30 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28e40 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
28e50 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
28e60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
28e70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
28e80 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
28e90 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
28ea0 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
28eb0 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
28ec0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
28ed0 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
28ee0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28f00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28f10 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
28f20 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
28f30 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
28f40 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28f50 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
28f60 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
28f70 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
28f80 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
28f90 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
28fa0 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
28fb0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
28fc0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28fd0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
28fe0 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
28ff0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
29000 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
29010 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
29020 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
29030 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29040 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
29050 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
29060 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
29070 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
29080 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
29090 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
290a0 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
290b0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
290c0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
290d0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
290e0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
290f0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
29100 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
29110 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29120 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
29130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
29140 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
29150 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
29160 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
29170 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
29180 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
29190 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
291a0 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
291b0 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
291c0 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
291d0 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
291e0 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
291f0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
29200 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
29210 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
29220 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
29230 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
29240 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
29250 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
29260 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
29270 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
29280 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
29290 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
292a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
292b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
292c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
292d0 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
292e0 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
292f0 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
29300 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
29310 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
29320 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
29330 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
29340 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
29350 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
29360 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
29370 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
29380 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
29390 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
293a0 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
293b0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
293c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
293d0 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
293e0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
293f0 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
29400 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
29410 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
29420 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
29430 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
29440 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
29450 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
29460 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
29470 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
29480 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
29490 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
294a0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
294b0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
294c0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
294d0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
294e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
294f0 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
29500 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
29510 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
29520 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
29530 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
29540 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
29550 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
29560 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
29570 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
29580 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
29590 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
295a0 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
295b0 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
295c0 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
295d0 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
295e0 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
295f0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
29600 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
29610 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
29620 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
29630 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
29640 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
29650 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
29660 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
29670 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
29680 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
29690 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
296a0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
296b0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
296c0 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
296d0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
296e0 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
296f0 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
29700 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
29710 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
29720 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
29730 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
29740 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
29750 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
29760 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
29770 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
29780 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
29790 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
297a0 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
297b0 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
297c0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
297d0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
297e0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
297f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29800 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
29810 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
29820 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
29830 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
29840 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
29850 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
29860 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
29870 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
29880 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
29890 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
298a0 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
298b0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
298c0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
298d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
29900 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
29910 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
29920 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
29930 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
29940 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
29950 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
29960 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
29970 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
29980 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
29990 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
299a0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
299b0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
299c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
299d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
299e0 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
299f0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
29a00 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
29a10 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
29a20 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
29a30 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
29a40 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
29a50 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
29a60 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
29a70 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
29a80 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
29a90 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
29aa0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
29ab0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
29ac0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29ad0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
29ae0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
29af0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
29b00 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
29b10 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
29b20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
29b30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66  );.  }..  /* Bef
29b40 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72  ore the first wr
29b50 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46  ite, give the VF
29b60 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74  S a hint of what
29b70 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20   the final.  ** 
29b80 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62  file size will b
29b90 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
29ba0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29bb0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
29bc0 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72  ->fd) );.  if( r
29bd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
29be0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69   && pPager->dbHi
29bf0 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  ntSize<pPager->d
29c00 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69  bSize.   && (pLi
29c10 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c  st->pDirty || pL
29c20 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  ist->pgno>pPager
29c30 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20  ->dbHintSize).  
29c40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
29c50 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50  nt64 szFile = pP
29c60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a  ager->pageSize *
29c70 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
29c80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
29c90 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
29ca0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
29cb0 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
29cc0 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
29cd0 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70   &szFile);.    p
29ce0 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
29cf0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
29d00 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ze;.  }..  while
29d10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29d20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
29d30 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
29d40 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
29d50 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
29d60 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
29d70 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
29d80 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
29d90 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
29da0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
29db0 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
29dc0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
29dd0 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
29de0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
29df0 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
29e00 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
29e10 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
29e20 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
29e30 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
29e40 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
29e50 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
29e60 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
29e70 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
29e80 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
29e90 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
29ea0 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
29eb0 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
29ec0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
29ed0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29ee0 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
29ef0 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
29f00 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
29f10 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
29f20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
29f30 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
29f40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29f50 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
29f60 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
29f70 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29fa0 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
29fb0 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73  */    ..      as
29fc0 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c  sert( (pList->fl
29fd0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
29fe0 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
29ff0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
2a000 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
2a010 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
2a020 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pList);..      /
2a030 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74  * Encode the dat
2a040 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
2a050 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
2a060 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  ist->pData, pgno
2a070 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 6, return SQLI
2a080 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70  TE_NOMEM_BKPT, p
2a090 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
2a0a0 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
2a0b0 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
2a0c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a0d0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
2a0e0 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
2a0f0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
2a100 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
2a110 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
2a120 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
2a130 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
2a140 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
2a150 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
2a160 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
2a170 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2a180 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
2a190 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
2a1a0 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
2a1b0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
2a1c0 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
2a1d0 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
2a1e0 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
2a1f0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
2a200 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
2a210 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
2a220 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
2a230 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
2a240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a250 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
2a260 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
2a270 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
2a280 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
2a290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
2a2a0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
2a2b0 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b  R_STAT_WRITE]++;
2a2c0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
2a2d0 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a  e any backup obj
2a2e0 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65  ects copying the
2a2f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
2a300 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20  s pager. */.    
2a310 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
2a320 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
2a330 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
2a340 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b  *)pList->pData);
2a350 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ..      PAGERTRA
2a360 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE(("STORE %d pa
2a370 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
2a380 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2a390 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
2a3a0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
2a3b0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
2a3c0 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f  ist)));.      IO
2a3d0 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
2a3e0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2a3f0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
2a400 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
2a410 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
2a420 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ount);.    }else
2a430 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
2a440 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
2a450 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2a460 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
2a470 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  o));.    }.    p
2a480 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
2a490 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c  h(pList);.    pL
2a4a0 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
2a4b0 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
2a4c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a4d0 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
2a4e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
2a4f0 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20   is open. If it 
2a500 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
2a510 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
2a520 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
2a530 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2a540 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
2a550 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
2a560 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
2a570 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   An .** SQLITE_I
2a580 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
2a590 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2a5a0 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  if a call to sql
2a5b0 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a  ite3OsOpen() .**
2a5c0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2a5d0 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
2a5e0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
2a5f0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2a600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
2a610 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2a620 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  >sjfd) ){.    if
2a630 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2a640 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2a650 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
2a660 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
2a670 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
2a680 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
2a690 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
2a6a0 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
2a6b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2a6c0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
2a6d0 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
2a6e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
2a6f0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
2a700 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2a710 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
2a720 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
2a730 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
2a740 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
2a750 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
2a760 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2a770 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
2a780 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2a790 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
2a7a0 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
2a7b0 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
2a7c0 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
2a7d0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
2a7e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2a7f0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
2a800 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2a810 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
2a820 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
2a830 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
2a840 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
2a850 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
2a860 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
2a870 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
2a880 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
2a890 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
2a8a0 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
2a8b0 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
2a8c0 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
2a8d0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2a8e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a8f0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
2a900 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2a910 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
2a920 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2a930 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2a940 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
2a950 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
2a960 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
2a970 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
2a980 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
2a990 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2a9a0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
2a9b0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2a9c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
2a9d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2a9e0 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
2a9f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2aa00 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
2aa10 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
2aa20 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
2aa30 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2aa40 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
2aa50 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  eInJournal(pPage
2aa60 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20  r, pPg) .       
2aa70 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
2aa80 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2aa90 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  e .    );.    rc
2aaa0 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
2aab0 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  l(pPager);..    
2aac0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f  /* If the sub-jo
2aad0 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64  urnal was opened
2aae0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f   successfully (o
2aaf0 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70  r was already op
2ab00 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74  en),.    ** writ
2ab10 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  e the journal re
2ab20 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69  cord into the fi
2ab30 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
2ab40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ab50 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
2ab60 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
2ab70 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
2ab80 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d  t = (i64)pPager-
2ab90 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
2aba0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
2abb0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2abc0 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45  2;.  .      CODE
2abd0 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
2abe0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
2abf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ac00 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32  MEM_BKPT, pData2
2ac10 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  );.      PAGERTR
2ac20 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
2ac30 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
2ac40 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2ac50 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2ac60 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
2ac70 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
2ac80 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
2ac90 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
2aca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2acb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2acc0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2acd0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
2ace0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
2acf0 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
2ad00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ad10 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2ad20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ad30 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b  pPager->nSubRec+
2ad40 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
2ad50 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2ad60 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  t>0 );.    rc = 
2ad70 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
2ad80 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
2ad90 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
2ada0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
2adb0 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
2adc0 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64  alPageIfRequired
2add0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2ade0 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
2adf0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
2ae00 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e   return subjourn
2ae10 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d  alPage(pPg);.  }
2ae20 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2ae30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2ae40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2ae50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2ae60 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
2ae70 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73  ayer when it has
2ae80 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a   reached some.**
2ae90 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d   soft memory lim
2aea0 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  it. The first ar
2aeb0 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
2aec0 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f  ter to a Pager o
2aed0 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61  bject.** (cast a
2aee0 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20  s a void*). The 
2aef0 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20  pager is always 
2af00 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74  'purgeable' (not
2af10 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
2af20 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20   database). The 
2af30 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2af40 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
2af50 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73  o a page that is
2af60 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64   .** currently d
2af70 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20  irty but has no 
2af80 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
2af90 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65  rences. The page
2afa0 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73  .** is always as
2afb0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2afc0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
2afd0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
2afe0 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  st .** argument.
2aff0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
2b000 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2b010 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63  is to make pPg c
2b020 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20  lean by writing 
2b030 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
2b040 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2b050 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73  ase file, if pos
2b060 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20  sible. This may 
2b070 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20  involve syncing 
2b080 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2b090 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ile. .**.** If s
2b0a0 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74  uccessful, sqlit
2b0b0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2b0c0 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  n() is called on
2b0d0 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a   the page and.**
2b0e0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2b0f0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2b100 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2b110 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
2b120 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61  the.** page clea
2b130 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  n, the IO error 
2b140 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2b150 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61  . If the page ca
2b160 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20  nnot be.** made 
2b170 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f  clean for some o
2b180 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74  ther reason, but
2b190 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2b1a0 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
2b1b0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
2b1c0 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
2b1d0 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e  MakeClean() is n
2b1e0 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  ot called..*/.st
2b1f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
2b200 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
2b210 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
2b220 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
2b230 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
2b240 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2b250 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
2b260 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
2b270 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2b280 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2b290 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  Y );..  /* The d
2b2a0 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43  oNotSpill NOSYNC
2b2b0 20 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69   bit is set duri
2b2c0 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
2b2d0 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
2b2e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
2b2f0 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
2b300 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
2b310 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
2b320 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
2b330 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2b340 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
2b350 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
2b360 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
2b370 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
2b380 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
2b390 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
2b3a0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f  he doNotSpill RO
2b3b0 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62  LLBACK and OFF b
2b3c0 69 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  its inhibits all
2b3d0 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a   cache spilling.
2b3e0 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20    ** regardless 
2b3f0 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
2b400 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
2b410 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
2b420 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61  et during.  ** a
2b430 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20   rollback or by 
2b440 75 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65  user request, re
2b450 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a  spectively..  **
2b460 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69  .  ** Spilling i
2b470 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65  s also prohibite
2b480 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72  d when in an err
2b490 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74  or state since t
2b4a0 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c  hat could.  ** l
2b4b0 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
2b4c0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e  corruption.   In
2b4d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
2b4e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a  lementation it .
2b4f0 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62    ** is impossib
2b500 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63  le for sqlite3Pc
2b510 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62  acheFetch() to b
2b520 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72  e called with cr
2b530 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a  eateFlag==3.  **
2b540 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72   while in the er
2b550 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65  ror state, hence
2b560 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   it is impossibl
2b570 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
2b580 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61  ne to.  ** be ca
2b590 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f  lled in the erro
2b5a0 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74  r state.  Nevert
2b5b0 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75  heless, we inclu
2b5c0 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a  de a NEVER().  *
2b5d0 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65  * test for the e
2b5e0 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20  rror state as a 
2b5f0 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73  safeguard agains
2b600 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73  t future changes
2b610 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
2b620 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
2b630 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  de) ) return SQL
2b640 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61  ITE_OK;.  testca
2b650 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2b660 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2b670 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  AG_ROLLBACK );. 
2b680 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2b690 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2b6a0 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b  SPILLFLAG_OFF );
2b6b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2b6c0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2b6d0 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59  & SPILLFLAG_NOSY
2b6e0 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  NC );.  if( pPag
2b6f0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20  er->doNotSpill. 
2b700 20 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64    && ((pPager->d
2b710 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49  oNotSpill & (SPI
2b720 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c  LLFLAG_ROLLBACK|
2b730 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21  SPILLFLAG_OFF))!
2b740 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  =0.      || (pPg
2b750 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
2b760 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20  NEED_SYNC)!=0). 
2b770 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b780 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2b790 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
2b7a0 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ;.  if( pagerUse
2b7b0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
2b7c0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69     /* Write a si
2b7d0 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74  ngle frame for t
2b7e0 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20  his page to the 
2b7f0 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
2b800 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49   subjournalPageI
2b810 66 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 20  fRequired(pPg); 
2b820 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b840 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61  rc = pagerWalFra
2b850 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c  mes(pPager, pPg,
2b860 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
2b870 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
2b880 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
2b890 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72  l file if requir
2b8a0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
2b8b0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2b8c0 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20  NEED_SYNC .     
2b8d0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
2b8e0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
2b8f0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a  CACHEMOD.    ){.
2b900 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
2b910 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31  ournal(pPager, 1
2b920 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
2b930 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e  /* Write the con
2b940 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
2b950 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  e out to the dat
2b960 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
2b970 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2b990 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67  sert( (pPg->flag
2b9a0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2b9b0 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  C)==0 );.      r
2b9c0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
2b9d0 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c  pagelist(pPager,
2b9e0 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   pPg);.    }.  }
2b9f0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
2ba00 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
2ba10 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2ba20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
2ba30 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
2ba40 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2ba50 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2ba60 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2ba70 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
2ba80 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
2ba90 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
2baa0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2bab0 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   rc); .}../*.** 
2bac0 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66 65  Flush all unrefe
2bad0 72 65 6e 63 65 64 20 64 69 72 74 79 20 70 61 67  renced dirty pag
2bae0 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  es to disk..*/.i
2baf0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  nt sqlite3PagerF
2bb00 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50 61 67  lush(Pager *pPag
2bb10 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2bb20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2bb30 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
2bb40 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73  .    PgHdr *pLis
2bb50 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
2bb60 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
2bb70 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
2bb80 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
2bb90 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
2bba0 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  er) );.    while
2bbb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bbc0 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
2bbd0 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d    PgHdr *pNext =
2bbe0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
2bbf0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
2bc00 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
2bc10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 74      rc = pagerSt
2bc20 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61 67  ress((void*)pPag
2bc30 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  er, pList);.    
2bc40 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74 20    }.      pList 
2bc50 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  = pNext;.    }. 
2bc60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2bc70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2bc80 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
2bc90 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62  e a new Pager ob
2bca0 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70  ject and put a p
2bcb0 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20  ointer to it.** 
2bcc0 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65  in *ppPager. The
2bcd0 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76   pager should ev
2bce0 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65  entually be free
2bcf0 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a  d by passing it.
2bd00 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
2bd10 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a  erClose()..**.**
2bd20 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
2bd30 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70  rgument is the p
2bd40 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62  ath to the datab
2bd50 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
2bd60 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
2bd70 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
2bd80 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
2bd90 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2bda0 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
2bdb0 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
2bdc0 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
2bdd0 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  Temporary files 
2bde0 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  are be deleted.*
2bdf0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2be00 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c  when they are cl
2be10 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61  osed. If zFilena
2be20 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
2be30 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e   then .** all in
2be40 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
2be50 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69  d in cache. It i
2be60 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2be70 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69  to disk. .** Thi
2be80 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
2be90 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e   implement an in
2bea0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2beb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74  ..**.** The nExt
2bec0 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65  ra parameter spe
2bed0 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65  cifies the numbe
2bee0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
2bef0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ace allocated.**
2bf00 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68   along with each
2bf10 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
2bf20 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61   This space is a
2bf30 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
2bf40 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20  user.** via the 
2bf50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
2bf60 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a  xtra() API..**.*
2bf70 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75  * The flags argu
2bf80 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20  ment is used to 
2bf90 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69  specify properti
2bfa0 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74  es that affect t
2bfb0 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  he.** operation 
2bfc0 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  of the pager. It
2bfd0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
2bfe0 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63  d some bitwise c
2bff0 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ombination.** of
2c000 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61   the PAGER_* fla
2c010 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
2c020 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
2c030 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
2c040 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
2c050 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
2c060 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
2c070 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
2c080 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
2c090 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
2c0a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
2c0b0 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
2c0c0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
2c0d0 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
2c0e0 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
2c0f0 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
2c100 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2c110 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
2c120 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
2c130 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
2c140 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2c150 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
2c160 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
2c170 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
2c180 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
2c190 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
2c1a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
2c1b0 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
2c1c0 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
2c1d0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
2c1e0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2c1f0 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
2c200 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
2c210 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
2c220 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
2c230 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2c240 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
2c250 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
2c260 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
2c270 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
2c280 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
2c290 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
2c2a0 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
2c2b0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2c2c0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2c2d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2c2e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2c2f0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
2c300 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
2c310 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
2c320 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
2c330 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2c340 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c360 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
2c370 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
2c380 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
2c390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2c3a0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
2c3b0 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
2c3c0 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
2c3d0 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
2c3e0 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
2c3f0 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
2c400 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
2c410 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
2c420 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
2c430 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2c440 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
2c450 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
2c460 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c470 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
2c480 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2c490 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
2c4a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2c4b0 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
2c4c0 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
2c4d0 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
2c4e0 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
2c4f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2c500 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2c510 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2c520 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
2c530 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2c540 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
2c550 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
2c560 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
2c570 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
2c580 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2c590 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2c5a0 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
2c5b0 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2c5c0 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
2c5d0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
2c5e0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
2c5f0 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
2c600 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2c610 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
2c620 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
2c630 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
2c640 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
2c650 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
2c660 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
2c670 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
2c680 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
2c690 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
2c6a0 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2c6b0 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
2c6c0 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66  /.  u32 szPageDf
2c6d0 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
2c6e0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
2c6f0 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
2c700 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  size */.  const 
2c710 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20  char *zUri = 0; 
2c720 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74     /* URI args t
2c730 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
2c740 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20  nUri = 0;       
2c750 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c760 66 20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61  f bytes of URI a
2c770 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a  rgs at *zUri */.
2c780 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
2c790 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
2c7a0 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
2c7b0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
2c7c0 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
2c7d0 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
2c7e0 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
2c7f0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
2c800 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
2c810 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
2c820 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
2c830 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
2c840 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
2c850 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
2c860 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
2c870 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2c880 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
2c890 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
2c8a0 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
2c8b0 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
2c8c0 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
2c8d0 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
2c8e0 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
2c8f0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
2c900 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
2c910 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
2c920 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2c930 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
2c940 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
2c950 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
2c960 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
2c970 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
2c980 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
2c990 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
2c9a0 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
2c9b0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
2c9c0 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c  ze(pVfs));.  }el
2c9d0 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
2c9e0 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
2c9f0 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  (sqlite3MemJourn
2ca00 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a  alSize());.  }..
2ca10 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
2ca20 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
2ca30 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
2ca40 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
2ca50 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
2ca60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2ca70 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
2ca80 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47   if( flags & PAG
2ca90 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  ER_MEMORY ){.   
2caa0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
2cab0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2cac0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2cad0 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
2cae0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2caf0 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  up(0, zFilename)
2cb00 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74  ;.      if( zPat
2cb10 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75  hname==0  ) retu
2cb20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2cb30 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74  BKPT;.      nPat
2cb40 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2cb50 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2cb60 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  e);.      zFilen
2cb70 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
2cb80 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2cb90 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
2cba0 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
2cbb0 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
2cbc0 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
2cbd0 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
2cbe0 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
2cbf0 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
2cc00 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
2cc10 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
2cc20 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
2cc30 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
2cc40 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
2cc50 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2cc60 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2cc70 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  0] ){.    const 
2cc80 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61  char *z;.    nPa
2cc90 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
2cca0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
2ccb0 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2ccc0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2ccd0 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  0, nPathname*2);
2cce0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
2ccf0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
2cd00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2cd10 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
2cd20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2cd30 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2cd40 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2cd50 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2cd60 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2cd70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2cd80 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2cd90 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2cda0 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2cdb0 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2cdc0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2cdd0 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2cde0 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2cdf0 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2ce00 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2ce10 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2ce20 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2ce30 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2ce40 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2ce50 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2ce60 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2ce70 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2ce80 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2ce90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2cea0 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2ceb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cec0 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2ced0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2cee0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2cef0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2cf00 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2cf10 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2cf20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2cf30 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2cf40 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2cf50 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2cf60 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2cf70 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2cf80 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2cf90 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2cfa0 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2cfb0 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2cfc0 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2cfd0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2cfe0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2cff0 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2d000 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2d010 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2d020 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2d030 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2d040 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2d050 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2d060 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d070 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d080 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2d090 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d0a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2d0b0 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2d0c0 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2d0d0 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2d0e0 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2d0f0 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2d100 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2d110 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2d120 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2d130 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2d140 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2d150 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2d160 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2d170 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d190 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2d1a0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2d1b0 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1d0 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2d1e0 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2d1f0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2d200 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2d210 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2d220 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2d230 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2d240 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2d250 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2d260 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2d270 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2d280 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2d290 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2d2a0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2d2b0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2d2c0 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2d2d0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2d2e0 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2d2f0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2d300 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2d310 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2d320 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2d330 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2d340 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2d350 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2d360 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2d370 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2d380 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2d390 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2d3a0 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2d3b0 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2d3c0 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2d3d0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2d3e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2d3f0 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2d400 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d410 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2d420 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2d430 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2d440 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2d450 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2d460 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2d470 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2d480 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2d490 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2d4a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2d4b0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2d4c0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2d4d0 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2d4e0 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2d4f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2d500 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2d510 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2d520 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2d530 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2d540 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2d550 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2d560 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2d570 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d580 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  M_BKPT;.  }.  pP
2d590 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20  ager =          
2d5a0 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74      (Pager*)(pPt
2d5b0 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50  r);.  pPager->pP
2d5c0 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63  Cache =    (PCac
2d5d0 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  he*)(pPtr += ROU
2d5e0 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2d5f0 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  er)));.  pPager-
2d600 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33  >fd =   (sqlite3
2d610 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2d620 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2d630 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  e));.  pPager->s
2d640 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
2d650 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2d660 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2d670 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile));.  pPager-
2d680 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33  >jfd =  (sqlite3
2d690 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2d6a0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2d6b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
2d6c0 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72  ename =    (char
2d6d0 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2d6e0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61  alFileSize);.  a
2d6f0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2d700 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67  E_ALIGNMENT(pPag
2d710 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  er->jfd) );..  /
2d720 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61  * Fill in the Pa
2d730 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e  ger.zFilename an
2d740 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
2d750 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71   buffers, if req
2d760 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
2d770 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
2d780 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61   assert( nPathna
2d790 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67  me>0 );.    pPag
2d7a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
2d7b0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2d7c0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2d7d0 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2d7e0 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
2d7f0 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
2d800 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2d810 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63   if( nUri ) memc
2d820 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c  py(&pPager->zFil
2d830 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
2d840 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  1], zUri, nUri);
2d850 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2d860 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
2d870 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2d880 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2d890 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2d8a0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2d8b0 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b  journal\000", 8+
2d8c0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  2);.    sqlite3F
2d8d0 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2d8e0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2d8f0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
2d900 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d910 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61  OMIT_WAL.    pPa
2d920 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61  ger->zWal = &pPa
2d930 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2d940 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20  athname+8+1];.  
2d950 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2d960 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  >zWal, zPathname
2d970 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2d980 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2d990 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
2d9a0 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34  ], "-wal\000", 4
2d9b0 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
2d9c0 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67  FileSuffix3(pPag
2d9d0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2d9e0 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65  Pager->zWal);.#e
2d9f0 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
2da00 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2da10 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2da20 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2da30 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2da40 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2da50 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2da60 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2da70 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2da80 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2da90 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
2daa0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2dab0 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
2dac0 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2dad0 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
2dae0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2daf0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2db00 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2db10 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
2db20 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73  , &fout);.    as
2db30 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a  sert( !memDb );.
2db40 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2db50 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2db60 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
2db70 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2db80 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2db90 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
2dba0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
2dbb0 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
2dbc0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2dbd0 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
2dbe0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
2dbf0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
2dc00 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
2dc10 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
2dc20 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
2dc30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
2dc40 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2dc50 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
2dc60 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
2dc70 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2dc80 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
2dc90 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
2dca0 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
2dcb0 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
2dcc0 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
2dcd0 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
2dce0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dcf0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
2dd00 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2dd10 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2dd20 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2dd30 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64  .      if( !read
2dd40 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
2dd50 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2dd60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
2dd70 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
2dd80 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2dd90 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2dda0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
2ddb0 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
2ddc0 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65  eDflt<pPager->se
2ddd0 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20  ctorSize ){.    
2dde0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2ddf0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2de00 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2de10 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2de20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2de30 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
2de40 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2de50 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ZE;.          }e
2de60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2de70 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2de80 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2de90 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2dea0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66   }.        }.#if
2deb0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2dec0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2ded0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2dee0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2def0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2df00 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
2df10 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
2df20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2df30 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2df40 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
2df50 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2df60 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2df70 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2df80 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2df90 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2dfa0 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2dfb0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2dfc0 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2dfd0 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  *2){.           
2dfe0 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
2dff0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
2e000 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
2e010 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2e020 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
2e030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e040 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
2e050 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
2e060 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b    pPager->noLock
2e070 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62   = sqlite3_uri_b
2e080 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65  oolean(zFilename
2e090 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a  , "nolock", 0);.
2e0a0 20 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26        if( (iDc &
2e0b0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d   SQLITE_IOCAP_IM
2e0c0 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20  MUTABLE)!=0.    
2e0d0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72     || sqlite3_ur
2e0e0 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e  i_boolean(zFilen
2e0f0 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22  ame, "immutable"
2e100 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
2e110 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51    vfsFlags |= SQ
2e120 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e130 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  LY;.          go
2e140 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  to act_like_temp
2e150 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _file;.      }. 
2e160 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2e170 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2e180 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2e190 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2e1a0 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2e1b0 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2e1c0 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2e1d0 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2e1e0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2e1f0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2e200 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2e210 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2e220 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2e230 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2e240 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2e250 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2e260 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2e270 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2e280 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2e290 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2e2a0 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2e2b0 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2e2c0 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2e2d0 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2e2e0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2e2f0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2e300 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2e310 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20  his branch also 
2e320 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d  runs for files m
2e330 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62  arked as immutab
2e340 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f  le..    */ .act_
2e350 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a  like_temp_file:.
2e360 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
2e370 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
2e380 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
2e390 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74  DER;     /* Pret
2e3a0 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68  end we already h
2e3b0 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ave a lock */.  
2e3c0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2e3d0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2e3e0 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20  ;    /* Pretend 
2e3f0 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53  we are in EXCLUS
2e400 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  IVE mode */.    
2e410 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2e420 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2e430 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b     /* Do no lock
2e440 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f  ing */.    readO
2e450 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
2e460 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e470 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
2e480 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2e490 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
2e4a0 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
2e4b0 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
2e4c0 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
2e4d0 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
2e4e0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
2e4f0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
2e500 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
2e510 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e520 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2e530 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
2e540 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e550 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
2e560 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
2e570 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
2e580 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
2e590 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
2e5a0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2e5b0 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
2e5c0 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ct. */.  if( rc=
2e5d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e5e0 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
2e5f0 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 6e 45 78  <1000 );.    nEx
2e600 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
2e610 74 72 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  tra);.    rc = s
2e620 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
2e630 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
2e640 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
2e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e660 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
2e670 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
2e680 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
2e690 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a  ->pPCache);.  }.
2e6a0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
2e6b0 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65  r occurred above
2e6c0 2c 20 66 72 65 65 20 74 68 65 20 20 50 61 67 65  , free the  Page
2e6d0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
2e6e0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
2e6f0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
2e700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e710 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2e720 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2e730 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
2e740 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
2e750 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
2e760 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
2e770 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2e780 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2e790 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
2e7a0 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61  FILEHANDLEID(pPa
2e7b0 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72  ger->fd), pPager
2e7c0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  ->zFilename));. 
2e7d0 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
2e7e0 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
2e7f0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2e800 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d  ame))..  pPager-
2e810 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  >useJournal = (u
2e820 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20  8)useJournal;.  
2e830 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
2e840 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
2e850 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
2e860 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
2e870 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
2e880 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e890 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
2e8a0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e8b0 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
2e8c0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2e8d0 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
2e8e0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
2e8f0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
2e900 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
2e910 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
2e920 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f  R_UNLOCK; */.  /
2e930 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
2e940 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
2e950 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
2e960 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
2e970 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
2e980 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2e990 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
2e9a0 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
2e9b0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2e9c0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
2e9d0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2e9e0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2e9f0 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
2ea00 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2ea10 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
2ea20 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
2ea30 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2ea40 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2ea50 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
2ea60 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
2ea70 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
2ea80 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
2ea90 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73  ly;.  assert( us
2eaa0 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
2eab0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2eac0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
2ead0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2eae0 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
2eaf0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2eb00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2eb10 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a  >fullSync==0 );.
2eb20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2eb30 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30  er->extraSync==0
2eb40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2eb50 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2eb60 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  s==0 );.    asse
2eb70 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  rt( pPager->walS
2eb80 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2eb90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2eba0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2ebb0 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
2ebc0 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c      pPager->full
2ebd0 53 79 6e 63 20 3d 20 31 3b 0a 23 69 66 20 53 51  Sync = 1;.#if SQ
2ebe0 4c 49 54 45 5f 45 58 54 52 41 5f 44 55 52 41 42  LITE_EXTRA_DURAB
2ebf0 4c 45 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  LE.    pPager->e
2ec00 78 74 72 61 53 79 6e 63 20 3d 20 31 3b 0a 23 65  xtraSync = 1;.#e
2ec10 6c 73 65 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  lse.    pPager->
2ec20 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 23  extraSync = 0;.#
2ec30 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
2ec40 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
2ec50 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2ec60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  ;.    pPager->wa
2ec70 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  lSyncFlags = SQL
2ec80 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
2ec90 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  | WAL_SYNC_TRANS
2eca0 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61  ACTIONS;.    pPa
2ecb0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2ecc0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2ecd0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
2ece0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2ecf0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2ed00 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
2ed10 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
2ed20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
2ed30 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2ed40 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
2ed50 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
2ed60 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2ed70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2ed80 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
2ed90 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
2eda0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2edb0 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
2edc0 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
2edd0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
2ede0 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
2edf0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2ee00 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2ee10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
2ee20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
2ee30 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
2ee40 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2ee50 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2ee60 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
2ee70 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
2ee80 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
2ee90 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
2eea0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
2eeb0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
2eec0 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
2eed0 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28  it;.  /* memset(
2eee0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
2eef0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
2ef00 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f  >aHash)); */.  /
2ef10 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70  * pPager->szMmap
2ef20 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2ef30 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77  T_MMAP_SIZE // w
2ef40 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62 74  ill be set by bt
2ef50 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50  ree.c */..  *ppP
2ef60 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
2ef70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ef80 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79  K;.}.../* Verify
2ef90 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
2efa0 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
2efb0 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65  be deleted or re
2efc0 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a  named out from.*
2efd0 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61 67 65  * under the page
2efe0 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
2eff0 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61  E_OK if the data
2f000 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65  base is still we
2f010 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74  re it ought.** t
2f020 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52  o be on disk.  R
2f030 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28  eturn non-zero (
2f040 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
2f050 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20  DBMOVED or some 
2f060 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
2f070 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ode from sqlite3
2f080 4f 73 41 63 63 65 73 73 28 29 29 20 69 66 20 74  OsAccess()) if t
2f090 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
2f0a0 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f  gone missing..*/
2f0b0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61 74 61  .static int data
2f0c0 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61  baseIsUnmoved(Pa
2f0d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2f0e0 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20  int bHasMoved = 
2f0f0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  0;.  int rc;..  
2f100 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
2f110 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
2f120 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
2f130 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
2f140 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2f150 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
2f160 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2f170 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c   && pPager->zFil
2f180 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63  ename[0] );.  rc
2f190 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
2f1a0 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
2f1b0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
2f1c0 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61  _HAS_MOVED, &bHa
2f1d0 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72  sMoved);.  if( r
2f1e0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
2f1f0 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ND ){.    /* If 
2f200 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69  the HAS_MOVED fi
2f210 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e  le-control is un
2f220 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73  implemented, ass
2f230 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
2f240 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74  e.    ** has not
2f250 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68   been moved.  Th
2f260 61 74 20 69 73 20 74 68 65 20 68 69 73 74 6f 72  at is the histor
2f270 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66  ical behavior of
2f280 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74   SQLite: prior t
2f290 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  o.    ** version
2f2a0 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72   3.8.3, it never
2f2b0 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20   checked */.    
2f2c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f2d0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2f2e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61  SQLITE_OK && bHa
2f2f0 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63  sMoved ){.    rc
2f300 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
2f310 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a  LY_DBMOVED;.  }.
2f320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f330 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2f340 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
2f350 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69  fter transitioni
2f360 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e  ng from PAGER_UN
2f370 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52  LOCK to.** PAGER
2f380 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49  _SHARED state. I
2f390 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65  t tests if there
2f3a0 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2f3b0 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20  l present in.** 
2f3c0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2f3d0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
2f3e0 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ger. A hot journ
2f3f0 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a  al is one that .
2f400 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ** needs to be p
2f410 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f  layed back. Acco
2f420 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75  rding to this fu
2f430 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f  nction, a hot-jo
2f440 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78  urnal.** file ex
2f450 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c  ists if the foll
2f460 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61  owing criteria a
2f470 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
2f480 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2f490 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  le exists in the
2f4a0 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e   file system, an
2f4b0 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63  d.**   * No proc
2f4c0 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2f4d0 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
2f4e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2f4f0 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a  base file, and.*
2f500 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61  *   * The databa
2f510 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69  se file itself i
2f520 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
2f530 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
2f540 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66  and.**   * The f
2f550 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
2f560 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2f570 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20  ists and is not 
2f580 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  0x00..**.** If t
2f590 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
2f5a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2f5b0 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
2f5c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2f5d0 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
2f5e0 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
2f5f0 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
2f600 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
2f610 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
2f620 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49  the same name. I
2f630 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2f640 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
2f650 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ** just deleted 
2f660 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20  using OsDelete, 
2f670 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2f680 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2f690 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2f6a0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
2f6b0 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63  utine does not c
2f6c0 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  heck if there is
2f6d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2f6e0 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74  l filename.** at
2f6f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2f700 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
2f710 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74  s, and that mast
2f720 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  er journal file.
2f730 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
2f740 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  t, then the jour
2f750 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2f760 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74  really hot. In t
2f770 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73  his.** case this
2f780 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
2f790 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  turn a false-pos
2f7a0 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72  itive. The pager
2f7b0 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72  _playback().** r
2f7c0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63  outine will disc
2f7d0 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f  over that the jo
2f7e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
2f7f0 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64  t really hot and
2f800 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f   .** will not ro
2f810 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a  ll it back. .**.
2f820 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ** If a hot-jour
2f830 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  nal file is foun
2f840 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78  d to exist, *pEx
2f850 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31  ists is set to 1
2f860 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f   and .** SQLITE_
2f870 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2f880 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  no hot-journal f
2f890 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ile is present, 
2f8a0 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73  *pExists is.** s
2f8b0 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
2f8c0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2f8d0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2f8e0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2f8f0 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  ng.** to determi
2f900 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
2f910 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  t a hot-journal 
2f920 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65  file exists, the
2f930 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64   IO error.** cod
2f940 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2f950 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
2f960 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66  pExists is undef
2f970 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
2f980 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
2f990 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
2f9a0 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a   int *pExists){.
2f9b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
2f9c0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
2f9d0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
2f9e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f9f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2fa00 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2fa10 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20  nt exists = 1;  
2fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fa30 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61  True if a journa
2fa40 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
2fa50 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f  t */.  int jrnlO
2fa60 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70  pen = !!isOpen(p
2fa70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20  Pager->jfd);..  
2fa80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fa90 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2faa0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2fab0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
2fac0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fad0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2fae0 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  EN );..  assert(
2faf0 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20   jrnlOpen==0 || 
2fb00 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  ( sqlite3OsDevic
2fb10 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2fb20 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a  (pPager->jfd) &.
2fb30 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
2fb40 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
2fb50 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20  N_OPEN.  ));..  
2fb60 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
2fb70 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
2fb80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2fb90 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
2fba0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2fbb0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
2fbc0 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
2fbd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2fbe0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
2fbf0 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  sts ){.    int l
2fc00 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20  ocked = 0;      
2fc10 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2fc20 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
2fc30 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2fc40 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  lock */..    /* 
2fc50 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68  Race condition h
2fc60 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72  ere:  Another pr
2fc70 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65  ocess might have
2fc80 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68   been holding th
2fc90 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53  e.    ** the RES
2fca0 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68  ERVED lock and h
2fcb0 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70  ave a journal op
2fcc0 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65  en at the sqlite
2fcd0 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20  3OsAccess() .   
2fce0 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20   ** call above, 
2fcf0 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20  but then delete 
2fd00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
2fd10 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65  drop the lock be
2fd20 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67  fore.    ** we g
2fd30 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  et to the follow
2fd40 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65  ing sqlite3OsChe
2fd50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
2fd60 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a   call.  If that.
2fd70 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61      ** is the ca
2fd80 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
2fd90 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65   might think the
2fda0 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
2fdb0 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  nal when.    ** 
2fdc0 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73  in fact there is
2fdd0 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73   none.  This res
2fde0 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d  ults in a false-
2fdf0 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77  positive which w
2fe00 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65  ill.    ** be de
2fe10 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20  alt with by the 
2fe20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65  playback routine
2fe30 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e  .  Ticket #3883.
2fe40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2fe50 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2fe60 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
2fe70 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
2fe80 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2fe90 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b  LITE_OK && !lock
2fea0 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  ed ){.      Pgno
2feb0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2fec0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2fed0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
2fee0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2fef0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2ff00 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2ff10 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
2ff20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ff30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
2ff40 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2ff50 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69   is zero pages i
2ff60 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61  n size, that mea
2ff70 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28  ns that either (
2ff80 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  1) the.        *
2ff90 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72  * journal is a r
2ffa0 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72  emnant from a pr
2ffb0 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74  ior database wit
2ffc0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
2ffd0 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  where.        **
2ffe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2fff0 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a  le but not the j
30000 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74  ournal was delet
30010 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69  ed, or (2) the i
30020 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  nitial.        *
30030 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
30040 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e  at populates a n
30050 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ew database is b
30060 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
30070 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
30080 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65  either case, the
30090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
300a0 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48  n be deleted.  H
300b0 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72  owever, take car
300c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  e.        ** not
300d0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
300e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
300f0 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
30100 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20  n due to.       
30110 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   ** journal_mode
30120 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20  =PERSIST..      
30130 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
30140 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72   nPage==0 && !jr
30150 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
30160 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
30170 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
30180 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
30190 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
301a0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
301b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
301c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
301d0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
301e0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
301f0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
30200 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
30210 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20  exclusiveMode ) 
30220 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
30230 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
30240 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
30250 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30260 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
30270 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
30280 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
30290 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
302a0 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
302b0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
302c0 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
302d0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
302e0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
302f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30300 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
30310 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
30320 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
30330 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
30340 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
30350 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
30360 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
30370 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
30380 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
30390 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
303a0 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
303b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
303c0 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
303d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
303e0 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
303f0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
30400 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
30410 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
30420 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
30430 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
30440 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30450 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
30460 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
30470 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
30480 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
30490 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
304a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
304b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
304c0 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  8 first = 0;.   
304d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
304e0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
304f0 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a  er->jfd, (void *
30500 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a  )&first, 1, 0);.
30510 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30520 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
30530 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
30540 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
30550 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30560 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30570 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
30580 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
30590 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
305a0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
305b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
305c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
305d0 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
305e0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
305f0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
30600 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
30610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
30620 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
30630 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
30640 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
30650 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
30660 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68           ** it h
30670 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72  as a zero header
30680 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
30690 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72  due to an I/O er
306a0 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20  ror, or.        
306b0 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
306c0 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61  be due to the ra
306d0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  ce condition des
306e0 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64  cribed above and
306f0 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
30700 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e  ** ticket #3883.
30710 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73    Either way, as
30720 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f  sume that the jo
30730 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20  urnal is hot..  
30740 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
30750 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c  s might be a fal
30760 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75  se positive.  Bu
30770 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e  t if it is, then
30780 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
30790 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f   ** automatic jo
307a0 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61  urnal playback a
307b0 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68  nd recovery mech
307c0 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a  anism will deal.
307d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
307e0 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20  ith it under an 
307f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77  EXCLUSIVE lock w
30800 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  here we do not n
30810 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
30820 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d     ** worry so m
30830 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f  uch with race co
30840 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nditions..      
30850 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30860 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
30870 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
30880 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30890 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
308a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
308b0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
308c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
308d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
308e0 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
308f0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
30900 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30910 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  le..** It is ill
30920 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
30930 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 75  ite3PagerGet() u
30940 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20  ntil after this 
30950 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
30960 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
30970 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73  y called. If a s
30980 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c  hared-lock is al
30990 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a  ready held when.
309a0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
309b0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
309c0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
309d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   The following o
309e0 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c  perations are al
309f0 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  so performed by 
30a00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
30a10 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65  *.**   1) If the
30a20 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
30a30 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  tly in PAGER_OPE
30a40 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  N state (no lock
30a50 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
30a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30a70 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
30a80 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
30a90 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
30aa0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
30ab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30ac0 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
30ad0 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
30ae0 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
30af0 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
30b00 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
30b10 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
30b20 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
30b30 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
30b40 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
30b50 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
30b60 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
30b70 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
30b80 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
30b90 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
30ba0 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
30bb0 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
30bc0 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
30bd0 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
30be0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
30bf0 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
30c00 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
30c10 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
30c20 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
30c30 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
30c40 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
30c50 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
30c60 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
30c70 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
30c80 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
30c90 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
30ca0 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
30cb0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
30cc0 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
30cd0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
30ce0 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
30cf0 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
30d00 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
30d10 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
30d20 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
30d30 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
30d40 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
30d50 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
30d60 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
30d70 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
30d80 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
30d90 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
30da0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
30db0 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
30dc0 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
30dd0 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
30de0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
30df0 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  .** rolling back
30e00 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c   a journal file,
30e10 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
30e20 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
30e30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
30e40 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
30e50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30e60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30e70 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
30e80 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30e90 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
30ea0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
30eb0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
30ec0 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
30ed0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
30ee0 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
30ef0 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69  ages. This impli
30f00 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
30f10 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65  r state should e
30f20 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50  ither.  ** be OP
30f30 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45  EN or READER. RE
30f40 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73  ADER is only pos
30f50 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67  sible if the pag
30f60 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20  er is or was in 
30f70 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  .  ** exclusive 
30f80 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a  access mode..  *
30f90 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
30fa0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
30fb0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
30fc0 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  e)==0 );.  asser
30fd0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
30fe0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
30ff0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31000 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
31010 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
31020 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
31030 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e  EADER );.  if( N
31040 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50  EVER(MEMDB && pP
31050 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
31060 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  { return pPager-
31070 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69  >errCode; }..  i
31080 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
31090 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
310a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
310b0 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74  _OPEN ){.    int
310c0 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31   bHotJournal = 1
310d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
310e0 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ue if there exis
310f0 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ts a hot journal
31100 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73  -file */..    as
31110 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
31120 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
31130 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
31140 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
31150 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31160 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31170 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31180 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
31190 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
311a0 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
311b0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  );.      goto fa
311c0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
311d0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
311e0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
311f0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
31200 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
31210 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
31220 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
31230 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
31240 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
31250 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
31260 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
31270 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  r->eLock<=SHARED
31280 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
31290 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
312a0 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a  l(pPager, &bHotJ
312b0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ournal);.    }. 
312c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
312d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
312e0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
312f0 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75  .    if( bHotJou
31300 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  rnal ){.      if
31310 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
31320 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ly ){.        rc
31330 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
31340 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  LY_ROLLBACK;.   
31350 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
31360 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31370 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
31380 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
31390 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
313a0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
313b0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   is.      ** imp
313c0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
313d0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
313e0 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
313f0 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
31400 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
31410 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
31420 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
31430 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
31440 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
31450 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
31460 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
31470 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
31480 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
31490 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
314a0 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
314b0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
314c0 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
314d0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f  the .      ** ho
314e0 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a  t-journal back..
314f0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
31500 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
31510 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
31520 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
31530 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a   requested, any.
31540 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70        ** other p
31550 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e  rocess attemptin
31560 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  g to access the 
31570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
31580 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20  ll get to .     
31590 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69   ** this point i
315a0 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
315b0 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  ail to obtain it
315c0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
315d0 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f  lock .      ** o
315e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
315f0 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ile..      **.  
31600 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68      ** Unless th
31610 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f  e pager is in lo
31620 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
31630 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c  sive mode, the l
31640 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ock is.      ** 
31650 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48  downgraded to SH
31660 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65  ARED_LOCK before
31670 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
31680 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f  eturns..      */
31690 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
316a0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
316b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
316c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
316d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
316e0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
316f0 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
31700 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   /* If it is not
31710 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e   already open an
31720 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  d the file exist
31730 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20  s on disk, open 
31740 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  the .      ** jo
31750 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
31760 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69  rite access. Wri
31770 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71  te access is req
31780 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20  uired because . 
31790 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75       ** in exclu
317a0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
317b0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
317c0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
317d0 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a  t open .      **
317e0 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73   and possibly us
317f0 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
31800 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41  tion later on. A
31810 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73  lso, write-acces
31820 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  s .      ** is u
31830 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  sually required 
31840 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
31850 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e  journal in journ
31860 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20  al_mode=persist 
31870 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28  .      ** mode (
31880 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75  and also for jou
31890 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61  rnal_mode=trunca
318a0 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  te on some syste
318b0 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ms)..      **.  
318c0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f      ** If the jo
318d0 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
318e0 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
318f0 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
31900 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72   .      ** other
31910 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61   connection mana
31920 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e  ged to get in an
31930 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62  d roll it back b
31940 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  efore .      ** 
31950 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
31960 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63  obtained the exc
31970 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76  lusive lock abov
31980 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20  e. Or, it .     
31990 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
319a0 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
319b0 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
319c0 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
319d0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77     ** function w
319e0 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68  as called and th
319f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
31a00 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
31a10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
31a20 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
31a30 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
31a40 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
31a50 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
31a60 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20  ger->pVfs;.     
31a70 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20     int bExists; 
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31a90 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
31aa0 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
31ab0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31ac0 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
31ad0 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
31ae0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
31af0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
31b00 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29  XISTS, &bExists)
31b10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31b20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
31b30 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
31b40 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
31b50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
31b60 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
31b70 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
31b80 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
31b90 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  AL;.          as
31ba0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
31bb0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
31bc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31bd0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
31be0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
31bf0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
31c00 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
31c10 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
31c20 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
31c30 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
31c40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31c60 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
31c70 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
31c80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31c90 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
31ca0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
31cb0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
31cc0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
31cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31ce0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20    }.      }. .  
31cf0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
31d00 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
31d10 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
31d20 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
31d30 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
31d40 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
31d50 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
31d60 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
31d70 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
31d80 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
31d90 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
31da0 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
31db0 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
31dc0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
31dd0 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20  ache.  Sync the 
31de0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot journal befo
31df0 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20  re playing.     
31e00 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63   ** it back sinc
31e10 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  e the process th
31e20 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c  at crashed and l
31e30 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  eft the hot jour
31e40 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  nal.      ** pro
31e50 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79  bably did not sy
31e60 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65  nc it and we are
31e70 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77   required to alw
31e80 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a  ays sync.      *
31e90 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  * the journal be
31ea0 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20  fore playing it 
31eb0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  back..      */. 
31ec0 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
31ed0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
31ee0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
31f00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
31f10 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
31f20 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
31f30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31f50 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
31f60 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
31f70 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
31f80 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
31f90 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ER_OPEN;.       
31fa0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
31fb0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
31fc0 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
31fd0 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b       pagerUnlock
31fe0 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
31ff0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
32000 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
32010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32020 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
32030 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
32040 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
32050 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
32060 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
32070 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68  or roll back a h
32080 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65  ot-journal while
32090 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
320a0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
320b0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72          ** pager
320c0 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  _unlock() routin
320d0 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
320e0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
320f0 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20  g to unlock.    
32100 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e      ** the file.
32110 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61   If the unlock a
32120 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68  ttempt fails, th
32130 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d  en Pager.eLock m
32140 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
32150 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  * set to UNKNOWN
32160 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63  _LOCK (see the c
32170 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
32180 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20   #define for .  
32190 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e        ** UNKNOWN
321a0 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20  _LOCK above for 
321b0 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e  an explanation).
321c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
321d0 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72       ** In order
321e0 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e   to get pager_un
321f0 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69  lock() to do thi
32200 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74  s, set Pager.eSt
32210 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ate to.        *
32220 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f  * PAGER_ERROR no
32230 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  w. This is not a
32240 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20  ctually counted 
32250 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a  as a transition.
32260 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52          ** to ER
32270 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65  ROR state in the
32280 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61   state diagram a
32290 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
322a0 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  s file,.        
322b0 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
322c0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
322d0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
322e0 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a  ock() will very.
322f0 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74          ** short
32300 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68  ly transition th
32310 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74  e pager object t
32320 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  o the OPEN state
32330 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20  . Calling.      
32340 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65    ** assert_page
32350 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20  r_state() would 
32360 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20  fail now, as it 
32370 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f  should not be po
32380 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a  ssible.        *
32390 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52  * to be in ERROR
323a0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72   state when ther
323b0 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74  e are zero outst
323c0 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20  anding page .   
323d0 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63       ** referenc
323e0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
323f0 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
32400 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
32410 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
32420 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
32430 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32440 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32450 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20  R_OPEN );.      
32460 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
32470 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
32480 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20  OCK).           
32490 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
324a0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
324b0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45  ger->eLock>SHARE
324c0 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b  D_LOCK).      );
324d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
324e0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
324f0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73  e && pPager->has
32500 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29  HeldSharedLock )
32510 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
32520 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
32530 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
32540 64 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a  d then check to.
32550 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
32560 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
32570 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
32580 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
32590 20 68 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20   has changed,.  
325a0 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65      ** flush the
325b0 20 63 61 63 68 65 2e 20 20 54 68 65 20 68 61 73   cache.  The has
325c0 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66  HeldSharedLock f
325d0 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 69  lag prevents thi
325e0 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  s from.      ** 
325f0 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65  occurring on the
32600 20 76 65 72 79 20 66 69 72 73 74 20 61 63 63 65   very first acce
32610 73 73 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e  ss to a file, in
32620 20 6f 72 64 65 72 20 74 6f 20 73 61 76 65 20 61   order to save a
32630 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
32640 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c   unnecessary sql
32650 69 74 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c  ite3OsRead() cal
32660 6c 20 61 74 20 74 68 65 20 73 74 61 72 74 2d 75  l at the start-u
32670 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  p..      **.    
32680 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
32690 61 6e 67 65 73 20 61 72 65 20 64 65 74 65 63 74  anges are detect
326a0 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
326b0 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
326c0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ing.      ** at 
326d0 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
326e0 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
326f0 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
32700 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
32710 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
32720 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
32730 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
32740 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
32750 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
32760 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
32770 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
32780 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
32790 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65  .      ** a code
327a0 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
327b0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
327c0 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
327d0 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
327e0 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
327f0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
32800 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
32810 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
32820 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
32830 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
32840 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  l that.      ** 
32850 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
32860 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
32870 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d      Pgno nPage =
32880 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64   0;.      char d
32890 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
328a0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
328b0 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63  ers)];..      rc
328c0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
328d0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
328e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
328f0 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a  ) goto failed;..
32900 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e        if( nPage>
32910 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54  0 ){.        IOT
32920 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
32930 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
32940 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
32950 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  s)));.        rc
32960 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
32970 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
32980 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
32990 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
329a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
329b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
329c0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
329d0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
329e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
329f0 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
32a00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32a10 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
32a20 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
32a30 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
32a40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
32a50 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
32a60 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
32a70 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
32a80 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
32a90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
32aa0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
32ab0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d  ..        /* Unm
32ac0 61 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ap the database 
32ad0 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73  file. It is poss
32ae0 69 62 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e  ible that extern
32af0 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20  al processes.   
32b00 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65       ** may have
32b10 20 74 72 75 6e 63 61 74 65 64 20 74 68 65 20 64   truncated the d
32b20 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
32b30 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69   then extended i
32b40 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a  t back.        *
32b50 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  * to its origina
32b60 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69  l size while thi
32b70 73 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f  s process was no
32b80 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b  t holding a lock
32b90 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
32ba0 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
32bb0 6d 61 79 20 65 78 69 73 74 20 61 20 50 61 67 65  may exist a Page
32bc0 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74  r.pMap mapping t
32bd0 68 61 74 20 61 70 70 65 61 72 73 0a 20 20 20 20  hat appears.    
32be0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65      ** to be the
32bf0 20 72 69 67 68 74 20 73 69 7a 65 20 62 75 74 20   right size but 
32c00 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
32c10 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69  valid. Avoid thi
32c20 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73  s.        ** pos
32c30 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61  sibility by unma
32c40 70 70 69 6e 67 20 74 68 65 20 64 62 20 68 65 72  pping the db her
32c50 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  e. */.        if
32c60 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
32c70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
32c80 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
32c90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
32ca0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
32cb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
32cc0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
32cd0 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68  a WAL file in th
32ce0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f  e file-system, o
32cf0 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73  pen this databas
32d00 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20  e in WAL.    ** 
32d10 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  mode. Otherwise,
32d20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
32d30 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20  unction call is 
32d40 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
32d50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
32d60 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70  enWalIfPresent(p
32d70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20  Pager);.#ifndef 
32d80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
32d90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32da0 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72  er->pWal==0 || r
32db0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
32dc0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
32dd0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
32de0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
32df0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
32e00 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
32e10 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
32e20 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
32e30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
32e40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32e50 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53  ER_OPEN && rc==S
32e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32e70 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
32e80 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61  unt(pPager, &pPa
32e90 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
32ea0 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
32eb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32ec0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
32ed0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67  MEMDB );.    pag
32ee0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
32ef0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
32f00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32f10 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d  AGER_OPEN );.  }
32f20 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
32f30 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
32f40 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61  _READER;.    pPa
32f50 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
32f60 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  edLock = 1;.  }.
32f70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32f80 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
32f90 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
32fa0 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
32fb0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
32fc0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
32fd0 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
32fe0 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
32ff0 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
33000 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
33010 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
33020 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
33030 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
33040 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
33050 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
33060 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
33070 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
33080 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
33090 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
330a0 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
330b0 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
330c0 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
330d0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
330e0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20  er->nMmapOut==0 
330f0 26 26 20 28 73 71 6c 69 74 65 33 50 63 61 63 68  && (sqlite3Pcach
33100 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
33110 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29  ->pPCache)==0) )
33120 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  {.    pagerUnloc
33130 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
33140 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
33150 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66  ** Acquire a ref
33160 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e  erence to page n
33170 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61  umber pgno in pa
33180 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61  ger pPager (a pa
33190 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ge.** reference 
331a0 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a  has type DbPage*
331b0 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ). If the reques
331c0 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73  ted reference is
331d0 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
331e0 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69  y obtained, it i
331f0 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50  s copied to *ppP
33200 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
33210 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
33220 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
33230 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  ed page is alrea
33240 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  dy in the cache,
33250 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
33260 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
33270 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
33280 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
33290 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
332a0 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66  h data.** read f
332b0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
332c0 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63   file. In some c
332d0 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65  ases, the pcache
332e0 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63   module may.** c
332f0 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c  hoose not to all
33300 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
33310 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20   object and may 
33320 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
33330 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68  g.** object with
33340 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
33350 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
33360 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61  * The extra data
33370 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
33380 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
33390 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
333a0 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  os the .** first
333b0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
333c0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
333d0 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ry. If the page 
333e0 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a  requested is .**
333f0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
33400 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20  cache when this 
33410 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
33420 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74  ed, then the ext
33430 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65  ra.** data is le
33440 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ft as it was whe
33450 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  n the page objec
33460 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
33470 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
33480 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20  tabase image is 
33490 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
334a0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
334b0 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d  or if a .** non-
334c0 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61  zero value is pa
334d0 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f  ssed as the noCo
334e0 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ntent parameter 
334f0 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  and the .** requ
33500 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
33510 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64  t already stored
33520 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74   in the cache, t
33530 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61  hen no .** actua
33540 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75  l disk read occu
33550 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
33560 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
33570 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  e of the .** pag
33580 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
33590 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a   to all zeros. .
335a0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
335b0 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
335c0 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
335d0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
335e0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
335f0 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73  f the page. This
33600 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73   occurs in two s
33610 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
33620 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
33630 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
33640 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
33650 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
33660 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
33670 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
33680 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
33690 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
336a0 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
336b0 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
336c0 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c  cache to be fill
336d0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
336e0 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
336f0 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
33700 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
33710 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
33720 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
33730 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
33740 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
33750 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
33760 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
33770 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
33780 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
33790 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
337a0 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
337b0 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
337c0 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
337d0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
337e0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
337f0 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
33800 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
33810 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
33820 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
33830 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
33840 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
33850 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
33860 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
33870 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
33880 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
33890 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
338a0 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
338b0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
338c0 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
338d0 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
338e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
338f0 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
33900 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
33910 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
33920 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
33930 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
33940 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
33950 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
33960 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
33970 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
33980 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
33990 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
339a0 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
339b0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
339c0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
339d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
339e0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
339f0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
33a00 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
33a10 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
33a20 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
33a30 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
33a40 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
33a50 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
33a60 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
33a70 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
33a80 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
33a90 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
33aa0 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
33ab0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
33ac0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
33ad0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
33ae0 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
33af0 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
33b00 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
33b10 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
33b20 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
33b30 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
33b40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
33b50 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
33b60 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
33b70 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
33b80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
33b90 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
33ba0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
33bb0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
33bc0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
33bd0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
33be0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
33bf0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
33c00 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
33c10 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
33c20 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
33c30 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33c40 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20  ITE_OK;.  PgHdr 
33c50 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20  *pPg = 0;.  u32 
33c60 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  iFrame = 0;     
33c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
33c80 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f  rame to read fro
33c90 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20  m WAL file */.  
33ca0 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74  const int noCont
33cb0 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ent = (flags & P
33cc0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
33cd0 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  NT);..  /* It is
33ce0 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75   acceptable to u
33cf0 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28  se a read-only (
33d00 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61  mmap) page for a
33d10 6e 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20  ny page except. 
33d20 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68   ** page 1 if th
33d30 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d  ere is no write-
33d40 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
33d50 20 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f   or the ACQUIRE_
33d60 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c  READONLY.  ** fl
33d70 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64  ag was specified
33d80 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
33d90 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74  And so long as t
33da0 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a  he db is not a .
33db0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f    ** temporary o
33dc0 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
33dd0 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73  base.  */.  cons
33de0 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20  t int bMmapOk = 
33df0 28 70 67 6e 6f 3e 31 20 26 26 20 55 53 45 46 45  (pgno>1 && USEFE
33e00 54 43 48 28 70 50 61 67 65 72 29 0a 20 20 20 26  TCH(pPager).   &
33e10 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
33e20 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
33e30 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45  || (flags & PAGE
33e40 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29  R_GET_READONLY))
33e50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
33e60 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70  AS_CODEC.   && p
33e70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30  Pager->xCodec==0
33e80 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20  .#endif.  );..  
33e90 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  /* Optimization 
33ea0 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68  note:  Adding th
33eb0 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d  e "pgno<=1" term
33ec0 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30   before "pgno==0
33ed0 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  " here.  ** allo
33ee0 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  ws the compiler 
33ef0 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75  optimizer to reu
33f00 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  se the results o
33f10 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20  f the "pgno>1". 
33f20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20   ** test in the 
33f30 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65  previous stateme
33f40 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65  nt, and avoid te
33f50 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e  sting pgno==0 in
33f60 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e   the.  ** common
33f70 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f   case where pgno
33f80 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20   is large. */.  
33f90 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70  if( pgno<=1 && p
33fa0 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
33fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
33fc0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
33fd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33fe0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
33ff0 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
34000 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
34010 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
34020 20 20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74    assert( noCont
34030 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f  ent==0 || bMmapO
34040 6b 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72  k==0 );..  asser
34050 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65  t( pPager->hasHe
34060 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20  ldSharedLock==1 
34070 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
34080 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
34090 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
340a0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
340b0 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
340c0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
340d0 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
340e0 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
340f0 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
34100 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
34110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
34120 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
34130 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
34140 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
34150 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
34160 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
34170 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
34180 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
34190 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
341a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
341b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
341c0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
341d0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
341e0 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
341f0 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  iFrame==0 ){.   
34200 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
34210 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   0;..      rc = 
34220 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70  sqlite3OsFetch(p
34230 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20  Pager->fd, .    
34240 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f        (i64)(pgno
34250 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
34260 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e  geSize, pPager->
34270 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61  pageSize, &pData
34280 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
34290 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
342a0 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20  OK && pData ){. 
342b0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
342c0 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
342d0 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20 20  READER ){.      
342e0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
342f0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
34300 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
34310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
34320 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
34330 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
34340 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70  AcquireMapPage(p
34350 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61  Pager, pgno, pDa
34360 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20  ta, &pPg);.     
34370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34380 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
34390 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
343a0 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70   (i64)(pgno-1)*p
343b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
343c0 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
343d0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
343e0 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Pg ){.          
343f0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
34400 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
34410 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67     *ppPage = pPg
34420 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
34430 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
34440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34450 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34470 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34480 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34490 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a   }.    }..    {.
344a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 63        sqlite3_pc
344b0 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65  ache_page *pBase
344c0 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d 20  ;.      pBase = 
344d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
344e0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
344f0 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  he, pgno, 3);.  
34500 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
34510 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34520 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34530 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65 72  tchStress(pPager
34540 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34550 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20   &pBase);.      
34560 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34570 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
34580 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34590 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d        if( pBase=
345a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
345b0 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
345c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
345d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
345e0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
345f0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34600 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d  e_err;.        }
34610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
34620 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73  Pg = *ppPage = s
34630 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34640 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
34650 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
34660 42 61 73 65 29 3b 0a 20 20 20 20 20 20 61 73 73  Base);.      ass
34670 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20  ert( pPg!=0 );. 
34680 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
34690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
346a0 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
346b0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
346c0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
346d0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
346e0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
346f0 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
34700 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
34710 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
34720 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
34730 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
34740 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
34750 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
34760 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
34770 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
34780 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34790 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
347a0 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50  sert( pPg==(*ppP
347b0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
347c0 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  ( pPg->pgno==pgn
347d0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
347e0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
347f0 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  er || pPg->pPage
34800 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  r==0 );..  if( p
34810 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  Pg->pPager && !n
34820 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
34830 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
34840 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
34850 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
34860 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
34870 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
34880 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
34890 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
348a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
348b0 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
348c0 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
348d0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
348e0 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
348f0 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
34900 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20  TAT_HIT]++;.    
34910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34920 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
34930 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
34940 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
34950 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
34960 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
34970 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
34980 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20  alized.  */..   
34990 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
349a0 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54  Pager;..    /* T
349b0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
349c0 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
349d0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
349e0 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
349f0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72      ** number gr
34a00 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
34a10 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c   or the unused l
34a20 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20  ocking-page, is 
34a30 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
34a40 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
34a50 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
34a60 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
34a70 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
34a80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
34a90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
34aa0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34ab0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
34ac0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  .    if( MEMDB |
34ad0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
34ae0 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  <pgno || noConte
34af0 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  nt || !isOpen(pP
34b00 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
34b10 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
34b20 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
34b30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34b40 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  E_FULL;.        
34b50 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34b60 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
34b70 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74        if( noCont
34b80 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ent ){.        /
34b90 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74  * Failure to set
34ba0 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
34bb0 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76   InJournal bit-v
34bc0 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e  ectors is benign
34bd0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  ..        ** It 
34be0 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61  merely means tha
34bf0 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f  t we might do so
34c00 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f  me extra work to
34c10 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20   journal a .    
34c20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74      ** page that
34c30 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
34c40 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  o be journaled. 
34c50 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62   Nevertheless, b
34c60 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20  e sure .        
34c70 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ** to test the c
34c80 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c  ase where a mall
34c90 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
34ca0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
34cb0 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
34cc0 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76  a bit in a bit v
34cd0 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  ector..        *
34ce0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
34cf0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
34d00 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oc();.        if
34d10 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
34d20 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
34d30 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
34d40 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33  ( rc = ) sqlite3
34d50 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
34d60 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
34d70 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  no);.          t
34d80 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
34d90 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
34da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
34db0 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
34dc0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
34dd0 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67  tvecs(pPager, pg
34de0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
34df0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
34e00 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
34e10 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
34e20 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
34e30 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
34e40 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
34e50 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
34e60 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  e);.      IOTRAC
34e70 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
34e80 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
34e90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34ea0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
34eb0 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 62  Wal(pPager) && b
34ec0 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20  MmapOk==0 ){.   
34ed0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34ee0 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
34ef0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
34f00 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
34f10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34f20 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
34f30 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
34f50 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
34f60 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
34f70 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
34f80 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53  [PAGER_STAT_MISS
34f90 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ]++;.      rc = 
34fa0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20  readDbPage(pPg, 
34fb0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
34fc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
34fe0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34ff0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
35000 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
35010 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20  pagehash(pPg);. 
35020 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
35030 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
35040 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
35050 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
35060 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
35070 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
35080 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
35090 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
350a0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
350b0 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
350c0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
350d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
350e0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
350f0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
35100 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
35110 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
35120 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
35130 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
35140 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
35150 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
35160 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
35170 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20  n cache. .**.** 
35180 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
35190 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
351a0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
351b0 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
351c0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
351d0 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
351e0 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
351f0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
35200 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
35210 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
35220 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
35230 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
35240 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
35250 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
35260 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
35270 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
35280 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
35290 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
352a0 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
352b0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
352c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
352d0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c  gno pgno){.  sql
352e0 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
352f0 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
35300 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
35310 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
35320 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
35330 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
35340 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73  0 );.  pPage = s
35350 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
35360 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
35370 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61  e, pgno, 0);.  a
35380 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20  ssert( pPage==0 
35390 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65  || pPager->hasHe
353a0 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a  ldSharedLock );.
353b0 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 29    if( pPage==0 )
353c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
353d0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
353e0 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61  eFetchFinish(pPa
353f0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
35400 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  no, pPage);.}../
35410 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
35420 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
35430 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
35440 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
35450 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
35460 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
35470 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
35480 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
35490 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
354a0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
354b0 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
354c0 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
354d0 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
354e0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
354f0 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
35500 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
35510 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35520 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a  NotNull(DbPage *
35530 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
35540 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
35550 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50 61   pPg!=0 );.  pPa
35560 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
35570 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  r;.  if( pPg->fl
35580 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
35590 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65 6c   ){.    pagerRel
355a0 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67 29  easeMapPage(pPg)
355b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
355c0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
355d0 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
355e0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
355f0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76  sed(pPager);.}.v
35600 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
35610 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
35620 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20  g){.  if( pPg ) 
35630 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35640 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d  fNotNull(pPg);.}
35650 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
35660 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
35670 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
35680 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
35690 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
356a0 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
356b0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
356c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
356d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
356e0 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
356f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
35700 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
35710 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35720 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
35730 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
35740 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
35750 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
35760 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
35770 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
35780 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
35790 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
357a0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
357b0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
357c0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
357d0 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
357e0 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
357f0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
35800 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
35810 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
35820 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
35830 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
35840 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
35850 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
35860 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
35870 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
35880 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
35890 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
358a0 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
358b0 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
358c0 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
358d0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
358e0 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
358f0 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
35900 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
35910 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
35920 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
35930 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
35940 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
35950 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
35960 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
35970 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
35980 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
35990 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
359a0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
359b0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
359c0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
359d0 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
359e0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
359f0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
35a00 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
35a10 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
35a20 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
35a30 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
35a40 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
35a50 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
35a60 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
35a70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
35a80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
35a90 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
35aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
35ab0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
35ac0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
35ad0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
35ae0 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
35af0 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
35b00 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
35b10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35b20 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
35b30 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73  R_LOCKED );.  as
35b40 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
35b50 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
35b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35b70 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35b80 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
35b90 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
35ba0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
35bb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
35bc0 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
35bd0 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
35be0 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
35bf0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
35c00 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
35c10 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
35c20 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
35c30 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
35c40 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
35c50 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
35c60 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61  Code;..  if( !pa
35c70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
35c80 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
35c90 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
35ca0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
35cb0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
35cc0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
35cd0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
35ce0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
35cf0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
35d00 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
35d10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
35d20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
35d30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
35d40 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
35d50 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
35d60 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
35d70 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  n. */.    if( !i
35d80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
35d90 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
35da0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
35db0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
35dc0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
35dd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35de0 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
35df0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
35e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35e10 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
35e20 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
35e30 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
35e40 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
35e50 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  al file */.     
35e60 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
35e70 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
35e80 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
35e90 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
35ea0 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20  ->tempFile ? .  
35eb0 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
35ec0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
35ed0 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
35ee0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a  _TEMP_JOURNAL):.
35ef0 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
35f00 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
35f10 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20  URNAL).         
35f20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   );..        /* 
35f30 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
35f40 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68  database still h
35f50 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  as the same name
35f60 20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a   as it did when.
35f70 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61          ** it wa
35f80 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65  s originally ope
35f90 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ned. */.        
35fa0 72 63 20 3d 20 64 61 74 61 62 61 73 65 49 73 55  rc = databaseIsU
35fb0 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a  nmoved(pPager);.
35fc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
35fd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
35fe0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
35ff0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
36000 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
36010 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
36020 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
36030 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
36040 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
36050 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
36060 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
36070 72 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  r).          );.
36080 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
36090 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
360a0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
360b0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
360c0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30  r->jfd, flags, 0
360d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
360e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
360f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
36100 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
36110 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
36120 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
36130 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
36140 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
36150 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
36160 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
36170 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
36180 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
36190 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
361a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
361b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
361c0 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
361d0 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
361e0 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
361f0 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
36200 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
36210 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
36220 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
36230 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
36240 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
36250 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
36260 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
36270 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
36280 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
36290 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
362a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
362b0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
362c0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
362d0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
362e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
362f0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
36300 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36310 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36320 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
36330 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
36340 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
36350 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
36360 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
36370 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
36380 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
36390 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
363a0 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
363b0 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
363c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
363d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
363e0 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
363f0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
36400 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
36410 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
36420 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
36430 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
36440 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
36450 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36460 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
36470 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
36480 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
36490 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
364a0 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
364b0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
364c0 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
364d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
364e0 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
364f0 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
36500 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
36510 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
36520 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
36530 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
36540 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
36550 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
36560 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
36570 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
36580 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
36590 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
365a0 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
365b0 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
365c0 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
365d0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
365e0 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
365f0 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
36600 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
36610 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
36620 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
36630 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
36640 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
36650 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
36660 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
36670 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
36680 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
36690 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
366a0 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
366b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
366c0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
366d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
366e0 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
366f0 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
36700 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
36710 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
36720 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
36730 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
36740 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
36750 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
36760 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36770 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
36780 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
36790 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
367a0 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
367b0 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
367c0 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
367d0 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
367e0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
367f0 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
36800 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
36810 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
36820 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
36830 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
36840 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
36850 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
36860 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
36870 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
36880 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
36890 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
368a0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
368b0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
368c0 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
368d0 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
368e0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
368f0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
36900 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
36910 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
36920 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
36930 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
36940 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
36950 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
36960 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
36970 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36980 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
36990 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
369a0 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
369b0 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
369c0 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
369d0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
369e0 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20      /* Grab the 
369f0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
36a00 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
36a10 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61  uccessful, upgra
36a20 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50  de to.      ** P
36a30 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
36a40 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
36a50 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
36a60 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
36a70 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
36a80 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
36a90 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
36aa0 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
36ab0 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
36ac0 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
36ad0 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
36ae0 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
36af0 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
36b00 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
36b10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36b20 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
36b30 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
36b40 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
36b50 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
36b60 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
36b70 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
36b80 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
36b90 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
36ba0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
36bb0 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
36bc0 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
36bd0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
36be0 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
36bf0 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
36c00 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
36c10 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
36c20 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
36c30 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
36c40 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
36c50 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
36c60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
36c70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
36c80 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
36c90 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
36ca0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
36cb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
36cc0 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  & exFlag ){.    
36cd0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
36ce0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
36cf0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
36d00 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
36d10 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
36d20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36d30 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20     /* Change to 
36d40 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
36d50 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
36d60 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20      ** WAL mode 
36d70 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74  sets Pager.eStat
36d80 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45  e to PAGER_WRITE
36d90 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48  R_LOCKED or CACH
36da0 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68  EMOD.      ** wh
36db0 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
36dc0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
36dd0 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f  ut never to DBMO
36de0 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20  D or FINISHED.. 
36df0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
36e00 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65  because in those
36e10 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65   states the code
36e20 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61   to roll back sa
36e30 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
36e40 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d  * transactions m
36e50 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
36e60 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
36e70 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
36e80 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ase .      ** fi
36e90 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e  le as well as in
36ea0 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
36eb0 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
36ec0 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a  e incorrect in .
36ed0 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
36ee0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
36ef0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
36f00 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
36f10 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50  LOCKED;.      pP
36f20 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
36f30 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
36f40 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
36f50 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50  >dbFileSize = pP
36f60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
36f70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
36f80 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
36f90 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
36fa0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
36fb0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  f = 0;.    }..  
36fc0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
36fd0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
36fe0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36ff0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61  _READER );.    a
37000 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
37010 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
37020 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37030 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
37040 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
37050 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
37060 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ager) );.  }..  
37070 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
37080 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
37090 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
370a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
370b0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70  }../*.** Write p
370c0 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65  age pPg onto the
370d0 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c   end of the roll
370e0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
370f0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
37100 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65  OINLINE int page
37110 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61  rAddPageToRollba
37120 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20  ckJournal(PgHdr 
37130 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
37140 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
37150 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
37160 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63    u32 cksum;.  c
37170 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69  har *pData2;.  i
37180 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72  64 iOff = pPager
37190 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
371a0 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
371b0 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
371c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
371d0 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a  e page that.  **
371e0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
371f0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
37200 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
37210 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a  ert verifies.  *
37220 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
37230 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
37240 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
37250 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
37260 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
37270 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
37280 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
37290 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32  lOff );.  CODEC2
372a0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
372b0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
372c0 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
372d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61  _NOMEM_BKPT, pDa
372e0 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20  ta2);.  cksum = 
372f0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
37300 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
37310 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66 20  ;..  /* Even if 
37320 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
37330 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  l error occurs w
37340 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
37350 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
37360 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
37370 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
37380 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
37390 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68  e page..  ** Oth
373a0 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65  erwise, when the
373b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
373c0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
373d0 20 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70   logic in.  ** p
373e0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
373f0 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68  () will think th
37400 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
37410 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
37420 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  .  ** in the dat
37430 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
37440 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
37450 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
37460 67 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  g so,.  ** then 
37470 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
37480 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  ollow..  */.  pP
37490 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
374a0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20  R_NEED_SYNC;..  
374b0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
374c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
374d0 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
374e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
374f0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
37500 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
37510 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
37520 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
37530 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f  er->pageSize, iO
37540 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  ff+4);.  if( rc!
37550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
37560 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 77  urn rc;.  rc = w
37570 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
37580 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61  r->jfd, iOff+pPa
37590 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
375a0 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72   cksum);.  if( r
375b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
375c0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54  eturn rc;..  IOT
375d0 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
375e0 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
375f0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
37600 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61   .           pPa
37610 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
37620 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
37630 65 29 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  e));.  PAGER_INC
37640 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
37650 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
37660 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
37670 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
37680 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
37690 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
376a0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
376b0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
376c0 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
376d0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
376e0 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
376f0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
37700 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
37710 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70  rnalOff += 8 + p
37720 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
37730 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b  .  pPager->nRec+
37740 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  +;.  assert( pPa
37750 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
37760 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
37770 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
37780 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37790 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
377a0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
377b0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
377c0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
377d0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
377e0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
377f0 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
37800 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
37810 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
37820 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
37830 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
37840 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
37850 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37860 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
37870 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
37880 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
37890 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
378a0 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
378b0 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
378c0 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
378d0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
378e0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
378f0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
37900 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
37910 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
37920 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
37930 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
37940 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
37950 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
37960 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
37970 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
37980 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
37990 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
379a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
379b0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
379c0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
379d0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
379e0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
379f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
37a00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
37a10 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
37a20 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
37a30 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
37a40 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61  y .  ** been sta
37a50 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61  rted. The journa
37a60 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  l file may or ma
37a70 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74  y not be open at
37a80 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
37a90 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61  * It is never ca
37aa0 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f  lled in the ERRO
37ab0 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  R state..  */.  
37ac0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37ad0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37ae0 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
37af0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37b00 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37b10 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
37b20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37b30 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37b40 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
37b50 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
37b60 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
37b70 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
37b80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
37b90 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
37ba0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
37bb0 3d 3d 30 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50  ==0 );.  CHECK_P
37bc0 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
37bd0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
37be0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65   needs to be ope
37bf0 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65  ned. Higher leve
37c00 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  l routines have 
37c10 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74  already.  ** obt
37c20 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73  ained the necess
37c30 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67  ary locks to beg
37c40 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  in the write-tra
37c50 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68  nsaction, but th
37c60 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  e.  ** rollback 
37c70 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
37c80 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f  t yet be open. O
37c90 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68  pen it now if th
37ca0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
37cb0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
37cc0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61  s done before ca
37cd0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
37ce0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f  cheMakeDirty() o
37cf0 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a  n the page. .  *
37d00 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
37d10 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74  it were done aft
37d20 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  er calling sqlit
37d30 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
37d40 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  y(), then.  ** a
37d50 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63  n error might oc
37d60 63 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65  cur and the page
37d70 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69  r would end up i
37d80 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
37d90 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20  state.  ** with 
37da0 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20  pages marked as 
37db0 64 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63  dirty in the cac
37dc0 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  he..  */.  if( p
37dd0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37de0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
37df0 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ED ){.    rc = p
37e00 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
37e10 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
37e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37e30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
37e40 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
37e50 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
37e60 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
37e70 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
37e80 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
37e90 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
37ea0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
37eb0 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 20 74   that is about t
37ec0 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73  o be modified as
37ed0 20 64 69 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c   dirty. */.  sql
37ee0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
37ef0 72 74 79 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  rty(pPg);..  /* 
37f00 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  If a rollback jo
37f10 75 72 6e 61 6c 20 69 73 20 69 6e 20 75 73 65 2c  urnal is in use,
37f20 20 74 68 65 6d 20 6d 61 6b 65 20 73 75 72 65 20   them make sure 
37f30 74 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73  the page that is
37f40 20 61 62 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63   about.  ** to c
37f50 68 61 6e 67 65 20 69 73 20 69 6e 20 74 68 65 20  hange is in the 
37f60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
37f70 2c 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  , or if the page
37f80 20 69 73 20 61 20 6e 65 77 20 70 61 67 65 20 6f   is a new page o
37f90 66 66 0a 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64  ff.  ** then end
37fa0 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 6d 61   of the file, ma
37fb0 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6d 61  ke sure it is ma
37fc0 72 6b 65 64 20 61 73 20 50 47 48 44 52 5f 4e 45  rked as PGHDR_NE
37fd0 45 44 5f 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20  ED_SYNC..  */.  
37fe0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
37ff0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20  >pInJournal!=0) 
38000 3d 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  == isOpen(pPager
38010 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
38020 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
38030 61 6c 21 3d 30 0a 20 20 20 26 26 20 73 71 6c 69  al!=0.   && sqli
38040 74 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74  te3BitvecTestNot
38050 4e 75 6c 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e  Null(pPager->pIn
38060 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
38070 6e 6f 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  no)==0.  ){.    
38080 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
38090 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
380a0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
380b0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
380c0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
380d0 20 72 63 20 3d 20 70 61 67 65 72 41 64 64 50 61   rc = pagerAddPa
380e0 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72  geToRollbackJour
380f0 6e 61 6c 28 70 50 67 29 3b 0a 20 20 20 20 20 20  nal(pPg);.      
38100 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
38110 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
38120 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
38130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38140 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
38150 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
38160 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20  R_DBMOD ){.     
38170 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
38180 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
38190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
381a0 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
381b0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
381c0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
381d0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
381e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
381f0 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
38200 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
38210 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
38220 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
38230 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
38240 50 47 48 44 52 5f 44 49 52 54 59 20 62 69 74 20  PGHDR_DIRTY bit 
38250 69 73 20 73 65 74 20 61 62 6f 76 65 20 77 68 65  is set above whe
38260 6e 20 74 68 65 20 70 61 67 65 20 77 61 73 20 61  n the page was a
38270 64 64 65 64 20 74 6f 20 74 68 65 20 64 69 72 74  dded to the dirt
38280 79 2d 6c 69 73 74 0a 20 20 2a 2a 20 61 6e 64 20  y-list.  ** and 
38290 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
382a0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
382b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
382c0 6c 2e 20 20 57 61 69 74 20 75 6e 74 69 6c 20 6e  l.  Wait until n
382d0 6f 77 2c 0a 20 20 2a 2a 20 61 66 74 65 72 20 74  ow,.  ** after t
382e0 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
382f0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6a 6f   successfully jo
38300 75 72 6e 61 6c 6c 65 64 2c 20 62 65 66 6f 72 65  urnalled, before
38310 20 73 65 74 74 69 6e 67 20 74 68 65 0a 20 20 2a   setting the.  *
38320 2a 20 50 47 48 44 52 5f 57 52 49 54 45 41 42 4c  * PGHDR_WRITEABL
38330 45 20 62 69 74 20 74 68 61 74 20 69 6e 64 69 63  E bit that indic
38340 61 74 65 73 20 74 68 61 74 20 74 68 65 20 70 61  ates that the pa
38350 67 65 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  ge can be safely
38360 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
38370 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
38380 50 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45 3b  PGHDR_WRITEABLE;
38390 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .  .  /* If the 
383a0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
383b0 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
383c0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
383d0 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77   it,.  ** then w
383e0 72 69 74 65 20 74 68 65 20 70 61 67 65 20 69 6e  rite the page in
383f0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
38400 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
38410 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 53 61   if( pPager->nSa
38420 76 65 70 6f 69 6e 74 3e 30 20 29 7b 0a 20 20 20  vepoint>0 ){.   
38430 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
38440 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70  PageIfRequired(p
38450 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  Pg);.  }..  /* U
38460 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
38470 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
38480 72 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  rn. */.  if( pPa
38490 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d  ger->dbSize<pPg-
384a0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
384b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
384c0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
384d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
384e0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 61 72  ** This is a var
384f0 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 50  iant of sqlite3P
38500 61 67 65 72 57 72 69 74 65 28 29 20 74 68 61 74  agerWrite() that
38510 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 73   runs when the s
38520 65 63 74 6f 72 20 73 69 7a 65 0a 2a 2a 20 69 73  ector size.** is
38530 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
38540 20 70 61 67 65 20 73 69 7a 65 2e 20 20 53 51 4c   page size.  SQL
38550 69 74 65 20 6d 61 6b 65 73 20 74 68 65 20 28 72  ite makes the (r
38560 65 61 73 6f 6e 61 62 6c 65 29 20 61 73 73 75 6d  easonable) assum
38570 70 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 61 6c  ption that.** al
38580 6c 20 62 79 74 65 73 20 6f 66 20 61 20 73 65 63  l bytes of a sec
38590 74 6f 72 20 61 72 65 20 77 72 69 74 74 65 6e 20  tor are written 
385a0 74 6f 67 65 74 68 65 72 20 62 79 20 68 61 72 64  together by hard
385b0 77 61 72 65 2e 20 20 48 65 6e 63 65 2c 20 61 6c  ware.  Hence, al
385c0 6c 20 62 79 74 65 73 20 6f 66 0a 2a 2a 20 61 20  l bytes of.** a 
385d0 73 65 63 74 6f 72 20 6e 65 65 64 20 74 6f 20 62  sector need to b
385e0 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 69 6e 20  e journalled in 
385f0 63 61 73 65 20 6f 66 20 61 20 70 6f 77 65 72 20  case of a power 
38600 6c 6f 73 73 20 69 6e 20 74 68 65 20 6d 69 64 64  loss in the midd
38610 6c 65 20 6f 66 0a 2a 2a 20 61 20 77 72 69 74 65  le of.** a write
38620 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c  ..**.** Usually,
38630 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
38640 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
38650 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 61   equal to the pa
38660 67 65 20 73 69 7a 65 2c 20 69 6e 20 77 68 69 63  ge size, in whic
38670 68 0a 2a 2a 20 63 61 73 65 20 70 61 67 65 73 20  h.** case pages 
38680 63 61 6e 20 62 65 20 69 6e 64 69 76 69 64 75 61  can be individua
38690 6c 6c 79 20 77 72 69 74 74 65 6e 2e 20 20 54 68  lly written.  Th
386a0 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
386b0 72 75 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 65  runs in the.** e
386c0 78 63 65 70 74 69 6f 6e 61 6c