/ Hex Artifact Content
Login

Artifact c532d51ccc74de8551a28eb932f3b1a1034017d3:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  f.};../*.** A op
5240: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
5250: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
5260: 73 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20  struct Pager. A 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
5280: 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f  * some of the mo
5290: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d  re important mem
52a0: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f  ber variables fo
52b0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74  llows:.**.** eSt
52c0: 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ate.**.**   The 
52d0: 63 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20  current 'state' 
52e0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
52f0: 65 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  ect. See the com
5300: 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a  ment and state.*
5310: 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76  *   diagram abov
5320: 65 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  e for a descript
5330: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
5340: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c   state..**.** eL
5350: 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  ock.**.**   For 
5360: 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64  a real on-disk d
5370: 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72  atabase, the cur
5380: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
5390: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
53a0: 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  ile -.**   NO_LO
53b0: 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
53c0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
53d0: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
53e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  ..**.**   For a 
53f0: 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
5400: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
5410: 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63  (neither of whic
5420: 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a  h require any.**
5430: 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20     locks), this 
5440: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
5450: 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53  ys set to EXCLUS
5460: 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20  IVE_LOCK. Since 
5470: 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61  such.**   databa
5480: 73 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20  ses always have 
5490: 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d  Pager.exclusiveM
54a0: 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69  ode==1, this tri
54b0: 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  cks the pager.**
54c0: 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68     logic into th
54d0: 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61  inking that it a
54e0: 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74  lready has all t
54f0: 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c  he locks it will
5500: 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20   ever.**   need 
5510: 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74  (and no reason t
5520: 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e  o release them).
5530: 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65  .**.**   In some
5540: 20 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75   (obscure) circu
5550: 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76  mstances, this v
5560: 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f  ariable may also
5570: 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20   be set to.**   
5580: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
5590: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
55a0: 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
55b0: 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  of UNKNOWN_LOCK 
55c0: 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73  for.**   details
55d0: 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f  ..**.** changeCo
55e0: 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20  untDone.**.**   
55f0: 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72  This boolean var
5600: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
5610: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5620: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5630: 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d  er .**   (the 4-
5640: 62 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c  byte header fiel
5650: 64 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74  d at byte offset
5660: 20 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62   24 of the datab
5670: 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a  ase file) is .**
5680: 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d     not updated m
5690: 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e  ore often than n
56a0: 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a  ecessary. .**.**
56b0: 20 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20     It is set to 
56c0: 74 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68  true when the ch
56d0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
56e0: 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77  ld is updated, w
56f0: 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f  hich .**   can o
5700: 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e  nly happen if an
5710: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
5720: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
5730: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
5740: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
5750: 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20   (set to false) 
5760: 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c  whenever an excl
5770: 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  usive lock is .*
5780: 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64  *   relinquished
5790: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
57a0: 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65   file. Each time
57b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
57c0: 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20  s committed,.** 
57d0: 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e    The changeCoun
57e0: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e  tDone flag is in
57f0: 73 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69  spected. If it i
5800: 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b  s true, the work
5810: 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e   of.**   updatin
5820: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
5830: 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  nter is omitted 
5840: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
5850: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
5860: 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e  **   This mechan
5870: 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ism means that w
5880: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  hen running in e
5890: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61  xclusive mode, a
58a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
58b0: 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61    need only upda
58c0: 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
58d0: 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20  unter once, for 
58e0: 74 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61  the first transa
58f0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69  ction.**   commi
5900: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d  tted..**.** setM
5910: 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68  aster.**.**   Wh
5920: 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  en PagerCommitPh
5930: 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c  aseOne() is call
5940: 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74  ed to commit a t
5950: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
5960: 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20  ay.**   (or may 
5970: 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d  not) specify a m
5980: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
5990: 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  me to be written
59a0: 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20   into the .**   
59b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
59c0: 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64  ore it is synced
59d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
59e0: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
59f0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
5a00: 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65  contains a maste
5a10: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5a20: 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20  r affects .**   
5a30: 74 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68  the way in which
5a40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5a50: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61  e is finalized a
5a60: 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
5a70: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f  tion is .**   co
5a80: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
5a90: 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e  d back when runn
5aa0: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5ab0: 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f  mode=PERSIST" mo
5ac0: 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f  de..**   If a jo
5ad0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
5ae0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  not contain a ma
5af0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b00: 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20  nter, it is.**  
5b10: 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76   finalized by ov
5b20: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5b30: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
5b40: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20  er with zeroes. 
5b50: 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20  If.**   it does 
5b60: 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72  contain a master
5b70: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5b80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5b90: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a  e is finalized .
5ba0: 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69  **   by truncati
5bb0: 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79  ng it to zero by
5bc0: 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20  tes, just as if 
5bd0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
5be0: 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e  ere .**   runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64  de=truncate" mod
5c10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e  e..**.**   Journ
5c20: 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f  al files that co
5c30: 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75  ntain master jou
5c40: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61  rnal pointers ca
5c50: 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65  nnot be finalize
5c60: 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79  d.**   simply by
5c70: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c80: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
5c90: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5ca0: 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d  s, as the.**   m
5cb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
5cc0: 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65  inter could inte
5cd0: 72 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a  rfere with hot-j
5ce0: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
5cf0: 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73  of any.**   subs
5d00: 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75  equently interru
5d10: 70 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  pted transaction
5d20: 20 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65   that reuses the
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
5d40: 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20  *.**   The flag 
5d50: 69 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f  is cleared as so
5d60: 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  on as the journa
5d70: 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69  l file is finali
5d80: 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20  zed (either.**  
5d90: 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50   by PagerCommitP
5da0: 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72  haseTwo or Pager
5db0: 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e  Rollback). If an
5dc0: 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e   IO error preven
5dd0: 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72  ts the.**   jour
5de0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
5df0: 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ing successfully
5e00: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
5e10: 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a  setMaster flag.*
5e20: 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61  *   is cleared a
5e30: 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70  nyway (and the p
5e40: 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74  ager will move t
5e50: 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a  o ERROR state)..
5e60: 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c  **.** doNotSpill
5e70: 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  , doNotSyncSpill
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74  .**.**   These t
5e90: 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  wo boolean varia
5ea0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5eb0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65 74  */..  u8 bUseFet
7c70: 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
7c80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7c90: 20 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 69   xFetch() */.  i
7ca0: 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20  nt nMmapOut;    
7cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7cc0: 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67  mber of mmap pag
7cd0: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74  es currently out
7ce0: 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71  standing */.  sq
7cf0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d  lite3_int64 mxMm
7d00: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73  ap;       /* Des
7d10: 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  ired maximum mma
7d20: 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64  p size */.  PgHd
7d30: 72 20 2a 70 46 72 65 65 3b 20 20 20 20 20 20 20  r *pFree;       
7d40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
7d50: 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67  of free mmap pag
7d60: 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74  e headers (pDirt
7d70: 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20  y) */.  /*.  ** 
7d80: 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69  End of the routi
7d90: 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c  nely-changing cl
7da0: 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a  ass members.  **
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31  *********/..  u1
7e00: 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  6 nExtra;       
7e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
7e20: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
7e30: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
7e40: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36  ry page */.  i16
7e50: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
7e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e70: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
7e80: 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63  es at end of eac
7e90: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  h page */.  u32 
7ea0: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
7eb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
7ec0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
7ed0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33  .xOpen() */.  u3
7ee0: 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  2 sectorSize;   
7ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
7f00: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
7f10: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
7f20: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
7f30: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7f50: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
7f60: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b  /.  Pgno mxPgno;
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
7f90: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ed size of the d
7fa0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34  atabase */.  i64
7fb0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
7fc0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
7fd0: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
7fe0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
7ff0: 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  les */.  char *z
8000: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
8010: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8020: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8030: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
8040: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
8050: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
8060: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
8070: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
8080: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
8090: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
80a0: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
80b0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
80c0: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
80d0: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
80e0: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
80f0: 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74  ler */.  int aSt
8100: 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  at[3];          
8110: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61       /* Total ca
8120: 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73  che hits, misses
8130: 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23   and writes */.#
8140: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8150: 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  T.  int nRead;  
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
8180: 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  s read */.#endif
8190: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
81a0: 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f  ter)(DbPage*); /
81b0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
81c0: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
81d0: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
81e0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
81f0: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
8200: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
8210: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
8220: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
8230: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
8240: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
8250: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8260: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8270: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8280: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8290: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
82a0: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
82b0: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
82c0: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
82d0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
82e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
82f0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
8300: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
8310: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
8320: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
8330: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
8340: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
8350: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8360: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8370: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8380: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8390: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
83a0: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
83b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
83c0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
83d0: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
83e0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
83f0: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
8400: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
8410: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
8420: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
8430: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
8440: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
8450: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8460: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8470: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8480: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8490: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
84a0: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
84b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
84c0: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
84d0: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
84e0: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
84f0: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
8500: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
8510: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8520: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8530: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
8540: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8550: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8560: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8570: 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68  RITE 2../*.** Th
8580: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
8590: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
85a0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
85b0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
85c0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
85d0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
85e0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
85f0: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
8600: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
8610: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
8620: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
8630: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8640: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
8650: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
8660: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8670: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8680: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
8690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86a0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
86b0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
86c0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
86d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
86e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86f0: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
8700: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
8710: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
8720: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
8730: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
8740: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
8750: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
8760: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
8770: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
8780: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
8790: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
87a0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
87b0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
87c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
87d0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
87e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
87f0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
8800: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
8810: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
8820: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8830: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
8840: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
8850: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8860: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
8870: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
8880: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8890: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
88a0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
88b0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
88c0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
88d0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
88e0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
88f0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
8900: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
8910: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
8920: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
8930: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
8940: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
8950: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
8960: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8970: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
8980: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
8990: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
89a0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
89b0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
89c0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
89d0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
89e0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
89f0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8a00: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
8a10: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
8a20: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
8a30: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
8a40: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
8a50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8a60: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
8a70: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
8a80: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
8a90: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
8aa0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
8ab0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
8ac0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
8ad0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
8ae0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
8af0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
8b00: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
8b10: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
8b20: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
8b30: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
8b40: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
8b50: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
8b60: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
8b70: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
8b80: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
8b90: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
8ba0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
8bb0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
8bc0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
8bd0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
8be0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
8bf0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
8c00: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
8c10: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
8c20: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
8c30: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
8c40: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
8c50: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
8c60: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
8c70: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
8c80: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
8c90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
8ca0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
8cb0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
8cc0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
8cd0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
8ce0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
8cf0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
8d00: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
8d10: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
8d20: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
8d30: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
8d40: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
8d50: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
8d60: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
8d70: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8d80: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
8d90: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
8da0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
8db0: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
8dc0: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
8dd0: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
8de0: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
8df0: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
8e00: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
8e10: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
8e20: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
8e30: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
8e40: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
8e50: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
8e60: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
8e70: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
8e80: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
8e90: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
8ea0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
8eb0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
8ec0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
8ed0: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
8ee0: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
8ef0: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
8f00: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
8f10: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
8f20: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
8f30: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
8f40: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
8f50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
8f60: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
8f70: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
8f80: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
8f90: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
8fa0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
8fb0: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
8fc0: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
8fd0: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
8fe0: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
8ff0: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
9000: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
9010: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
9020: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
9030: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
9040: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
9050: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
9060: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
9070: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
9080: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
9090: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
90a0: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
90b0: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
90c0: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
90d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
90e0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
90f0: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
9100: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
9110: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
9120: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
9130: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
9140: 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52  ethods)../*.** R
9150: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9160: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9170: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9180: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9190: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
91a0: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
91b0: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
91c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
91d0: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
91e0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
91f0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
9200: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
9210: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
9220: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
9230: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
9240: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
9250: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9260: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9270: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9280: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9290: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
92a0: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
92b0: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
92c0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
92d0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
92e0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
92f0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
9300: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
9310: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
9320: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
9330: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9340: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
9350: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9360: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9370: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9380: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9390: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
93a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
93b0: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
93c0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
93d0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
93e0: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
93f0: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
9400: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
9410: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
9420: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9430: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
9440: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9450: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9460: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9470: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9480: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9490: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
94a0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
94b0: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
94c0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
94d0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
94e0: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
94f0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9500: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
9510: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
9520: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
9530: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
9540: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
9550: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9560: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9570: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9580: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9590: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
95a0: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
95b0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
95c0: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
95d0: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
95e0: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
95f0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9600: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9610: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9620: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
9630: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9640: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9650: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9660: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9670: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9680: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9690: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
96a0: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
96b0: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
96c0: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
96d0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
96e0: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
96f0: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
9700: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9710: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9720: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
9730: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
9740: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9750: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9760: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9770: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9780: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9790: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
97a0: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
97b0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
97c0: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
97d0: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
97e0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
97f0: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9800: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9810: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9820: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9830: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9840: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9850: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9860: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9870: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9880: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9890: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
98a0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
98b0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
98c0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
98d0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
98e0: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
98f0: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9900: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9910: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9920: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9930: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9940: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9950: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9960: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9970: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9980: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9990: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
99a0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
99b0: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
99c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
99d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
99e0: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
99f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9a00: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9a10: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9a20: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9a40: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
9a50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
9a60: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
9a70: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
9a80: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
9a90: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
9aa0: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
9ab0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9ac0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9ad0: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
9ae0: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
9af0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
9b00: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9b10: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
9b20: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
9b30: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
9b40: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
9b50: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
9b60: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
9b70: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9b80: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9b90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ba0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
9bb0: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
9bc0: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
9bd0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
9be0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9bf0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
9c00: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
9c10: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9c20: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9c30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9c40: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9c50: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9c60: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9c70: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
9c80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9c90: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
9ca0: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
9cb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9cc0: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
9cd0: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
9ce0: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
9cf0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
9d00: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
9d10: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
9d20: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9d30: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
9d40: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
9d50: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9d60: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
9d70: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
9d80: 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  igSize );.      
9d90: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9da0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
9db0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
9dc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9dd0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9de0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
9df0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
9e00: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9e10: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
9e20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
9e30: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
9e40: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
9e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9e60: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
9e70: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
9e80: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9e90: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9ea0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
9eb0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
9ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
9ed0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
9ee0: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
9ef0: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
9f00: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
9f10: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
9f20: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
9f30: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
9f40: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
9f50: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
9f60: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
9f70: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
9f80: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
9f90: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
9fa0: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
9fb0: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
9fc0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
9fd0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
9fe0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
9ff0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a000: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a020: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a030: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a040: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a050: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a060: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a070: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a080: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a090: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a0a0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a0b0: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a0c0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a0d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a0e0: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a0f0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a100: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a110: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a120: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a130: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a140: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a150: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a160: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a170: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a180: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a190: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a1a0: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a1b0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a1c0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a1d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1e0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a1f0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a200: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a210: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a220: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a230: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a240: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a250: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a260: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a270: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a280: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a290: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a2a0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a2b0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a2c0: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a2d0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a2e0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a2f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a300: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a310: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a320: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a330: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a340: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a350: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a360: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a370: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a380: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a390: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a3a0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a3b0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a3c0: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a3d0: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
a3e0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a3f0: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
a400: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
a410: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
a420: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
a430: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
a440: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
a450: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
a460: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
a470: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
a480: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
a490: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
a4a0: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
a4b0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
a4c0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a4d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
a4e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
a4f0: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
a500: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
a510: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
a520: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
a530: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
a540: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
a550: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a560: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
a570: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
a580: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
a590: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
a5a0: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
a5b0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
a5c0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
a5d0: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
a5e0: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
a5f0: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
a600: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
a610: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
a620: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
a630: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
a640: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
a650: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
a660: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
a670: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
a680: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
a690: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
a6a0: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
a6b0: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
a6c0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
a6d0: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
a6e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
a6f0: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
a700: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
a710: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
a720: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
a730: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
a740: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
a750: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
a760: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
a770: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
a780: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
a790: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
a7a0: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
a7b0: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
a7c0: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
a7d0: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
a7e0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
a7f0: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
a800: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
a810: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
a820: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
a830: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
a840: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
a850: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
a860: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
a870: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
a880: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
a890: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
a8a0: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
a8b0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
a8c0: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
a8d0: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
a8e0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a8f0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
a900: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
a910: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
a920: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a930: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a940: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
a950: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
a960: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
a970: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
a980: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
a990: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
a9a0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
a9b0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
a9c0: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
a9d0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a9e0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
a9f0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
aa00: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
aa10: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
aa20: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
aa30: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
aa40: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
aa50: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
aa60: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
aa70: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
aa80: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
aa90: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
aaa0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
aab0: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
aac0: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
aad0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
aae0: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
aaf0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
ab00: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
ab10: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
ab20: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
ab30: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
ab40: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
ab50: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
ab60: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
ab70: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ab80: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
ab90: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
aba0: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
abb0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
abc0: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
abd0: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
abe0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
abf0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ac00: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
ac10: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
ac20: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ac30: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ac40: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
ac50: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
ac60: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
ac70: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
ac80: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
ac90: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
aca0: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
acb0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
acc0: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
acd0: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
ace0: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
acf0: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
ad00: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
ad10: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
ad20: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
ad30: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
ad40: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
ad50: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
ad60: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
ad70: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
ad80: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
ad90: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
ada0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
adb0: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
adc0: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
add0: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
ade0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
adf0: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
ae00: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
ae10: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
ae20: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
ae30: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
ae40: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
ae50: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
ae60: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
ae70: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
ae80: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
ae90: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
aea0: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
aeb0: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
aec0: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
aed0: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
aee0: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
aef0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
af00: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
af10: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
af20: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
af30: 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  pPg){.  Pgno pgn
af40: 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
af50: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
af60: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
af70: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
af80: 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  ; i<pPager->nSav
af90: 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  epoint; i++){.  
afa0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
afb0: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
afc0: 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20  Savepoint[i];.  
afd0: 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d    if( p->nOrig>=
afe0: 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74  pgno && 0==sqlit
aff0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e  e3BitvecTest(p->
b000: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
b010: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
b020: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
b030: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b040: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b050: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
b060: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
b070: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
b080: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b090: 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20  InJournal(PgHdr 
b0a0: 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
b0b0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b0c0: 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  t(pPg->pPager->p
b0d0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
b0e0: 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pgno);.}../*.** 
b0f0: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
b100: 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67  teger from the g
b110: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b120: 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65  ptor.  Store the
b130: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74   integer.** that
b140: 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65   is read in *pRe
b150: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
b160: 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
b170: 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e  ng worked, or an
b180: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
b190: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
b1a0: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c   wrong..**.** Al
b1b0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
b1c0: 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62  red on disk as b
b1d0: 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74  ig-endian..*/.st
b1e0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62  atic int read32b
b1f0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b200: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b210: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
b220: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
b230: 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  [4];.  int rc = 
b240: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
b250: 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29  , ac, sizeof(ac)
b260: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
b270: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b280: 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71  {.    *pRes = sq
b290: 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63  lite3Get4byte(ac
b2a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b2b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
b2c0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
b2d0: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ger into a strin
b2e0: 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d  g buffer in big-
b2f0: 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65  endian byte orde
b300: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75  r..*/.#define pu
b310: 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71  t32bits(A,B)  sq
b320: 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75  lite3Put4byte((u
b330: 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20  8*)A,B).../*.** 
b340: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
b350: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
b360: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
b370: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
b380: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
b390: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
b3a0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b3b0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b3c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b3d0: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
b3e0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
b3f0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
b400: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
b410: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
b420: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
b430: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
b440: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
b450: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  );.}../*.** Unlo
b460: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
b470: 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c  file to level eL
b480: 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20  ock, which must 
b490: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
b4a0: 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c  K.** or SHARED_L
b4b0: 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20  OCK. Regardless 
b4c0: 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
b4d0: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55  t the call to xU
b4e0: 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65  nlock().** succe
b4f0: 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67  eds, set the Pag
b500: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
b510: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28  e to match the (
b520: 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c  attempted) new l
b530: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  ock..**.** Excep
b540: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
b550: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
b560: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
b570: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
b580: 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74  * called, do not
b590: 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20   modify it. See 
b5a0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
b5b0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
b5c0: 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   .** UNKNOWN_LOC
b5d0: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
b5e0: 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f  tion of this..*/
b5f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b600: 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20  rUnlockDb(Pager 
b610: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f  *pPager, int eLo
b620: 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
b630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
b640: 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65  sert( !pPager->e
b650: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
b660: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65  pPager->eLock==e
b670: 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74  Lock );.  assert
b680: 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ( eLock==NO_LOCK
b690: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45   || eLock==SHARE
b6a0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
b6b0: 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  rt( eLock!=NO_LO
b6c0: 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61  CK || pagerUseWa
b6d0: 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
b6e0: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
b6f0: 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
b700: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b710: 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock>=eLock );.
b720: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b730: 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
b740: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
b750: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
b760: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
b770: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
b780: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
b790: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49  ock;.    }.    I
b7a0: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
b7b0: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
b7c0: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20  , eLock)).  }.  
b7d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b7e0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74  .** Lock the dat
b7f0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
b800: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
b810: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
b820: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SHARED_LOCK,.** 
b830: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
b840: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
b850: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
b860: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  s successful, se
b870: 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65  t the.** Pager.e
b880: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
b890: 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67   the new locking
b8a0: 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45   state. .**.** E
b8b0: 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e  xcept, if Pager.
b8c0: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
b8d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65  UNKNOWN_LOCK whe
b8e0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
b8f0: 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64  is .** called, d
b900: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20  o not modify it 
b910: 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c  unless the new l
b920: 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20  ocking state is 
b930: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20  EXCLUSIVE_LOCK. 
b940: 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  .** See the comm
b950: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
b960: 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e  efine of UNKNOWN
b970: 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
b980: 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20  lanation .** of 
b990: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
b9a0: 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  int pagerLockDb(
b9b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b9c0: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
b9d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b9e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ..  assert( eLoc
b9f0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
ba00: 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  | eLock==RESERVE
ba10: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
ba20: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
ba30: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
ba40: 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20  >eLock<eLock || 
ba50: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55  pPager->eLock==U
ba60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20  NKNOWN_LOCK ){. 
ba70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ba80: 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
ba90: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
baa0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bab0: 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  && (pPager->eLoc
bac0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c  k!=UNKNOWN_LOCK|
bad0: 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  |eLock==EXCLUSIV
bae0: 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20  E_LOCK) ){.     
baf0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
bb00: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
bb10: 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
bb20: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
bb30: 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d  r, eLock)).    }
bb40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
bb60: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
bb70: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
bb80: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
bb90: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
bba0: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
bbb0: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
bbc0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
bbd0: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
bbe0: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
bbf0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
bc00: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
bc10: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
bc20: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
bc30: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
bc40: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
bc50: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
bc60: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
bc70: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
bc80: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
bc90: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
bca0: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
bcb0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
bcc0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69  **.** The optimi
bcd0: 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61  zation is also a
bce0: 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f  lways enabled fo
bcf0: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
bd00: 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65  s. It is.** an e
bd10: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
bd20: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50  s function if pP
bd30: 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  ager is opened o
bd40: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  n an in-memory.*
bd50: 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  * database..**.*
bd60: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
bd70: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
bd80: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
bd90: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
bda0: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
bdb0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
bdc0: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
bdd0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
bde0: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
bdf0: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
be00: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
be10: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
be20: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
be30: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
be40: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
be50: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
be60: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
be70: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
be80: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
be90: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
bea0: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   dc;            
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bec0: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
bed0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
bee0: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
bf10: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61   */.    int szPa
bf20: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
bf30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
bf40: 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61  e size */..    a
bf50: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
bf60: 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20  ager->fd) );.   
bf70: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
bf80: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
bf90: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
bfa0: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
bfb0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
bfc0: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
bfd0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
bfe0: 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53  e;..    assert(S
bff0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c000: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
c010: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ;.    assert(SQL
c020: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c030: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
c040: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63  ;.    if( 0==(dc
c050: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
c060: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
c070: 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a  )) || nSector>sz
c080: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72  Page) ){.      r
c090: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
c0a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55   }..  return JOU
c0b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c0c0: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
c0d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23  _SZ(pPager);.}.#
c0e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
c0f0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c100: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
c110: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
c120: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
c130: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
c140: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
c150: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
c160: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
c170: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
c180: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
c190: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c1a0: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
c1b0: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
c1c0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
c1d0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
c1e0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
c1f0: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
c200: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
c210: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
c220: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
c230: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
c240: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
c250: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
c260: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
c270: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
c280: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
c290: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
c2a0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
c2b0: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
c2c0: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
c2d0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
c2e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
c2f0: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
c300: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
c310: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
c320: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
c330: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
c340: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
c350: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
c360: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
c370: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
c380: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
c390: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
c3a0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
c3b0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
c3c0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
c3d0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
c3e0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
c3f0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
c400: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
c410: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
c420: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
c430: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
c440: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
c450: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
c460: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
c470: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
c480: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
c490: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
c4a0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
c4b0: 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
c4c0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
c4d0: 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
c4e0: 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
c4f0: 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48  Y) || pPg->pageH
c500: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
c510: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
c520: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67  else.#define pag
c530: 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29  er_datahash(X,Y)
c540: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
c550: 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30  r_pagehash(X)  0
c560: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73  .#define pager_s
c570: 65 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23  et_pagehash(X).#
c580: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c590: 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20  E(x).#endif  /* 
c5a0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c5b0: 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  ES */../*.** Whe
c5c0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
c5d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c5e0: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
c5f0: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
c600: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c610: 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
c620: 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ad a master jour
c630: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72  nal file name fr
c640: 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f  om the .** end o
c650: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20  f the file and, 
c660: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63  if successful, c
c670: 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65  opies it into me
c680: 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a  mory supplied .*
c690: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
c6a0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
c6b0: 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ove writeMasterJ
c6c0: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65  ournal() for the
c6d0: 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20   format.** used 
c6e0: 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65  to store a maste
c6f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
c700: 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ame at the end o
c710: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
c720: 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20  ..**.** zMaster 
c730: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
c740: 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
c750: 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  st nMaster bytes
c760: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
c770: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69   the caller. Thi
c780: 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69  s should be sqli
c790: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
c7a0: 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20  me+1 (to ensure 
c7b0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75  there is.** enou
c7c0: 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74  gh space to writ
c7d0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
c7e0: 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74  rnal name). If t
c7f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c800: 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65  l.** name in the
c810: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67   journal is long
c820: 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20  er than nMaster 
c830: 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bytes (including
c840: 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   a.** nul-termin
c850: 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73  ator), then this
c860: 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69   is handled as i
c870: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
c880: 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65  nal name.** were
c890: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
c8a0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
c8b0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
c8c0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
c8d0: 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65  present at the e
c8e0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
c8f0: 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  l.** file, then 
c900: 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74  it is copied int
c910: 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
c920: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
c930: 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72  er. A.** nul-ter
c940: 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
c950: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
c960: 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  buffer following
c970: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
c980: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c990: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ..**.** If it is
c9a0: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
c9b0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
c9c0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
c9d0: 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73  present .** zMas
c9e0: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
c9f0: 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
ca00: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
ca10: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
ca20: 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e  urs while readin
ca30: 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
ca40: 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69  al file, an SQLi
ca50: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
ca60: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
ca70: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
ca80: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
ca90: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
caa0: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
cab0: 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a  , u32 nMaster){.
cac0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cae0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
caf0: 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20   u32 len;       
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
cb10: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f  ength in bytes o
cb20: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
cb30: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73   name */.  i64 s
cb40: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
cb50: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
cb60: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
cb70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72  journal file pJr
cb80: 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  nl */.  u32 cksu
cb90: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
cba0: 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75     /* MJ checksu
cbb0: 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  m value read fro
cbc0: 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  m journal */.  u
cbd0: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
cbe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
cbf0: 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
cc00: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
cc10: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
cc20: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
cc30: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
cc40: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61   header */.  zMa
cc50: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
cc60: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
cc70: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
cc80: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
cc90: 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a   &szJ)).   || sz
cca0: 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54  J<16.   || SQLIT
ccb0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
ccc0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
ccd0: 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20  J-16, &len)).   
cce0: 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  || len>=nMaster 
ccf0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
cd00: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
cd10: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
cd20: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
cd30: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
cd40: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
cd50: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
cd60: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
cd70: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
cd80: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
cd90: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
cda0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
cdb0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
cdc0: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
cdd0: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
cde0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
cdf0: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
ce00: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
ce10: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
ce20: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
ce30: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
ce40: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
ce50: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
ce60: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
ce70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
ce80: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
ce90: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
cea0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
ceb0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
cec0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
ced0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cee0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
cef0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
cf00: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
cf10: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
cf20: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
cf30: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
cf40: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
cf50: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
cf60: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
cf70: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
cf80: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
cf90: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
cfa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cfb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
cfc0: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
cfd0: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
cfe0: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
cff0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
d000: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
d010: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
d020: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
d030: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
d040: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
d050: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
d060: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
d070: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
d080: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
d090: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
d0a0: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
d0b0: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
d0e0: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
d100: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d120: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
d170: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
d180: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
d190: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
d1a0: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
d1b0: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
d1c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
d1d0: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
d1e0: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
d1f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d200: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
d210: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d220: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d230: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
d240: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
d250: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
d260: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
d270: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
d280: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d290: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
d2a0: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
d2b0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
d2c0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
d2d0: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
d2e0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
d2f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d300: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
d310: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d320: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
d330: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
d340: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
d350: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
d360: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
d370: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
d380: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
d390: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
d3a0: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
d3b0: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
d3c0: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
d3d0: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
d3e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d3f0: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
d400: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
d410: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
d420: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
d430: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
d440: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
d450: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
d460: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
d470: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
d480: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
d490: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d4a0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
d4b0: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
d4c0: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
d4d0: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
d4e0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d4f0: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
d500: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
d510: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
d520: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
d530: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
d540: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
d550: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d560: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
d570: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
d580: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
d590: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
d5a0: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
d5b0: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
d5c0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
d5d0: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
d5e0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
d5f0: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
d600: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
d610: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
d620: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
d630: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
d640: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
d650: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
d660: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
d670: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
d680: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
d690: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
d6a0: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
d6b0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d6c0: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
d6d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d6e0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
d710: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
d720: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
d730: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
d740: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
d750: 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c      const i64 iL
d760: 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  imit = pPager->j
d770: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
d780: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
d790: 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20  he of jsl */..  
d7a0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52    IOTRACE(("JZER
d7b0: 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67  OHDR %p\n", pPag
d7c0: 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54  er)).    if( doT
d7d0: 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69  runcate || iLimi
d7e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
d7f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
d800: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
d810: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
d820: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
d830: 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72  nst char zeroHdr
d840: 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20  [28] = {0};.    
d850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d860: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
d870: 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65  d, zeroHdr, size
d880: 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b  of(zeroHdr), 0);
d890: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
d8a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d8b0: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
d8c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
d8d0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
d8e0: 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
d8f0: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50  SYNC_DATAONLY|pP
d900: 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
d910: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d920: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
d930: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
d940: 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74   committed but t
d950: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20  he write lock . 
d960: 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68     ** is still h
d970: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  eld on the file.
d980: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
d990: 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67  ize limit config
d9a0: 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ured for .    **
d9b0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
d9c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
d9d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
d9e0: 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20  rently consumes 
d9f0: 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63  more.    ** spac
da00: 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69  e than that limi
da10: 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72  t allows for, tr
da20: 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  uncate it now. T
da30: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
da40: 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74      ** to sync t
da50: 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e  he file followin
da60: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
da70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
da80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
da90: 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  & iLimit>0 ){.  
daa0: 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20      i64 sz;.    
dab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dac0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
dad0: 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20  >jfd, &sz);.    
dae0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
daf0: 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74  _OK && sz>iLimit
db00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
db10: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
db20: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
db30: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  iLimit);.      }
db40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
db50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
db60: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
db70: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
db80: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
db90: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
dba0: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
dbb0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
dbc0: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
dbd0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
dbe0: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
dbf0: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
dc00: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
dc10: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
dc20: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
dc30: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
dc40: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
dc50: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
dc60: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
dc70: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
dc80: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
dc90: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
dca0: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
dcb0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
dcc0: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
dcd0: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
dce0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
dcf0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
dd00: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
dd10: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
dd20: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
dd30: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
dd40: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
dd50: 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  l..** - 4 bytes:
dd60: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73   Database page s
dd70: 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  ize..** .** Foll
dd80: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
dd90: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
dda0: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
ddb0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
ddc0: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
ddd0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
dde0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
ddf0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
de00: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
de10: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
de20: 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61  r *zHeader = pPa
de30: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
de40: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70   /* Temporary sp
de50: 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c  ace used to buil
de60: 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  d header */.  u3
de70: 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33 32  2 nHeader = (u32
de80: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
de90: 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66  e;/* Size of buf
dea0: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
deb0: 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75  y zHeader */.  u
dec0: 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  32 nWrite;      
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68     /* Bytes of h
def0: 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69  eader sector wri
df00: 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  tten */.  int ii
df10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df30: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
df40: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
df50: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
df60: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
df70: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
df80: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20  open. */..  if( 
df90: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
dfa0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
dfb0: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
dfc0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
dfd0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
dfe0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
dff0: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
e000: 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d   and any of them
e010: 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20   were created . 
e020: 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f   ** since the mo
e030: 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61  st recent journa
e040: 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  l header was wri
e050: 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65  tten, update the
e060: 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65   .  ** PagerSave
e070: 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
e080: 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a   fields now..  *
e090: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
e0a0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
e0b0: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
e0c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76  if( pPager->aSav
e0d0: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
e0e0: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
e0f0: 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
e100: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
e110: 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
e120: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
e130: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
e140: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
e150: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
e160: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
e170: 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  t(pPager);..  /*
e180: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
e190: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
e1a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
e1b0: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
e1c0: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
e1d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
e1e0: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
e1f0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
e200: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
e210: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
e220: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
e230: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
e240: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
e250: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
e260: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
e270: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
e280: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
e290: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
e2a0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
e2b0: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
e2c0: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
e2d0: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
e2e0: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
e2f0: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
e300: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
e310: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
e320: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
e330: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
e340: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
e350: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
e360: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
e370: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
e380: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
e390: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
e3a0: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
e3b0: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
e3c0: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
e3d0: 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  urred whilst wri
e3e0: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
e3f0: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74  nal.  ** file it
e400: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d   may contain som
e410: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20  e garbage data. 
e420: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63  There are two sc
e430: 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65  enarios.  ** whe
e440: 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e  re this risk can
e450: 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a   be ignored:.  *
e460: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
e470: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
e480: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f  no-sync mode. Co
e490: 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c  rruption can fol
e4a0: 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70  low a.  **     p
e4b0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20  ower failure in 
e4c0: 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79  this case anyway
e4d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
e4e0: 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  When the SQLITE_
e4f0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e500: 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  D flag is set. T
e510: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20  his guarantees. 
e520: 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72   **     that gar
e530: 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76  bage data is nev
e540: 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  er appended to t
e550: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
e560: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e570: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
e580: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  d) || pPager->no
e590: 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70 50  Sync );.  if( pP
e5a0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
e5b0: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
e5c0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
e5d0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
e5e0: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
e5f0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
e600: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
e610: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
e620: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
e630: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65  {.    memcpy(zHe
e640: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
e650: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
e660: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
e670: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e680: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e690: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
e6a0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
e6b0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65  {.    memset(zHe
e6c0: 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ader, 0, sizeof(
e6d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
e6e0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
e6f0: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
e700: 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  sh initializer *
e710: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
e720: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
e730: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e740: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
e750: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
e760: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e770: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e780: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
e790: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
e7a0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
e7b0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
e7c0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e7d0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e7e0: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
e7f0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
e800: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
e810: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
e820: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
e830: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
e840: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
e850: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
e860: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
e870: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
e880: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
e890: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e8a0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e8b0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
e8c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
e8d0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
e8e0: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
e8f0: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
e900: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
e910: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
e920: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
e930: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
e940: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
e950: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
e960: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
e970: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
e980: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
e990: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
e9a0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
e9b0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
e9c0: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
e9d0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
e9e0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e9f0: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
ea00: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
ea10: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ea20: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
ea30: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
ea40: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
ea50: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
ea60: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
ea70: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
ea80: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
ea90: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
eaa0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
eab0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
eac0: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
ead0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
eae0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
eaf0: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
eb00: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
eb10: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
eb20: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
eb30: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
eb40: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
eb50: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
eb60: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
eb70: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
eb80: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
eb90: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
eba0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
ebb0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
ebc0: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
ebd0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
ebe0: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
ebf0: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
ec00: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
ec10: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
ec20: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
ec30: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
ec40: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
ec50: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
ec60: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
ec70: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
ec80: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
ec90: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
eca0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
ecb0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
ecc0: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
ecd0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
ece0: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
ecf0: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
ed00: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
ed10: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
ed20: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
ed30: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
ed40: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
ed50: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
ed60: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
ed70: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ed80: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
ed90: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
eda0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
edb0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
edc0: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
edd0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
ede0: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
edf0: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
ee00: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
ee10: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
ee20: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
ee30: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
ee40: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
ee50: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
ee60: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
ee70: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
ee80: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
ee90: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
eea0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
eeb0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
eec0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
eed0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
eee0: 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65  Off );.    pPage
eef0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
ef00: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
ef10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ef20: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
ef30: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
ef40: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
ef50: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
ef60: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
ef70: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
ef80: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
ef90: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
efa0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
efb0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
efc0: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
efd0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
efe0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
eff0: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
f000: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
f010: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
f020: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
f030: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
f040: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
f050: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f060: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
f070: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
f080: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
f090: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
f0a0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
f0b0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
f0c0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
f0d0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
f0e0: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
f0f0: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
f100: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
f110: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
f120: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
f130: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
f140: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
f150: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
f160: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
f170: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
f180: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
f190: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
f1a0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
f1b0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
f1c0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
f1d0: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
f1e0: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
f1f0: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
f200: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
f210: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
f220: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
f230: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
f240: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
f250: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f260: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
f270: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
f280: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
f290: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
f2a0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
f2b0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
f2c0: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
f2d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
f2e0: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
f2f0: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
f300: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
f310: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
f320: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
f330: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f350: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
f360: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
f370: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
f380: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
f390: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f3a0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
f3b0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
f3c0: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
f3d0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
f3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
f3f0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
f400: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
f410: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
f420: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
f430: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
f440: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
f470: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
f480: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
f490: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
f4a0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
f4b0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
f4c0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
f4d0: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
f4e0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
f4f0: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
f500: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
f510: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
f520: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
f530: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
f540: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
f550: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
f560: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
f570: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
f580: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
f590: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
f5a0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
f5b0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
f5c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
f5d0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
f5e0: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
f5f0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
f600: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
f610: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
f620: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f630: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
f640: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
f650: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
f660: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
f670: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
f680: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
f690: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
f6a0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
f6b0: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
f6c0: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
f6d0: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
f6e0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
f6f0: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
f700: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
f710: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
f720: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
f730: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
f740: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f750: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
f760: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
f770: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
f780: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
f790: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
f7a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
f7b0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
f7c0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
f7d0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
f7e0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
f7f0: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
f800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f810: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
f820: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
f830: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
f840: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
f850: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
f860: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
f870: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
f880: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
f890: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
f8a0: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
f8b0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
f8c0: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
f8d0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
f8e0: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
f8f0: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
f900: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f910: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f920: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f930: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
f940: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
f950: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
f960: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
f970: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
f980: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
f990: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
f9a0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
f9b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
f9c0: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
f9d0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
f9e0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
f9f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa00: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
fa10: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
fa20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
fa30: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
fa40: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fa50: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
fa60: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
fa70: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
fa80: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
fa90: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  nal header */.. 
faa0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70     /* Read the p
fab0: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
fac0: 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c  tor-size journal
fad0: 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20   header fields. 
fae0: 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  */.    if( SQLIT
faf0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
fb00: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
fb10: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20  fd, iHdrOff+20, 
fb20: 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20  &iSectorSize)). 
fb30: 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
fb40: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
fb50: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
fb60: 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61  iHdrOff+24, &iPa
fb70: 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a  geSize)).    ){.
fb80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fb90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
fba0: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
fbb0: 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38  e prior to 3.5.8
fbc0: 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73 69   set the page-si
fbd0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  ze field of the.
fbe0: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68      ** journal h
fbf0: 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49  eader to zero. I
fc00: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73 73  n this case, ass
fc10: 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61 67  ume that the Pag
fc20: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20 20  er.pageSize.    
fc30: 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  ** variable is a
fc40: 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74 68  lready set to th
fc50: 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20 73  e correct page s
fc60: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
fc70: 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d 30  if( iPageSize==0
fc80: 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65 53   ){.      iPageS
fc90: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
fca0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20  geSize;.    }.. 
fcb0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
fcc0: 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64   the values read
fcd0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73   from the page-s
fce0: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
fcf0: 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a  ize fields.    *
fd00: 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  * are within ran
fd10: 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61  ge. To be 'in ra
fd20: 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65  nge', both value
fd30: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70  s need to be a p
fd40: 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ower.    ** of t
fd50: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
fd60: 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20  or equal to 512 
fd70: 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67  or 32, and not g
fd80: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
fd90: 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63  r .    ** respec
fda0: 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d  tive compile tim
fdb0: 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73  e maximum limits
fdc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fdd0: 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20   iPageSize<512  
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33  || iSectorSize<3
fe00: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
fe10: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
fe20: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
fe30: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
fe40: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
fe50: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
fe60: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
fe70: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
fe80: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
fe90: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
fea0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
feb0: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
fec0: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
fed0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
fee0: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
fef0: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
ff00: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
ff10: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
ff20: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
ff30: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
ff40: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
ff50: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
ff60: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
ff70: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
ff80: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
ff90: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
ffa0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
ffb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
ffc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ffd0: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
ffe0: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
fff0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
10000 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
10010 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
10020 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
10030 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
10040 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
10050 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
10060 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
10070 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
10080 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
10090 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
100a0 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50 61  ize(pPager, &iPa
100b0 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20  geSize, -1);.   
100c0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
100d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
100e0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
100f0 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
10100 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
10110 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
10120 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
10130 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
10140 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
10150 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
10160 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
10170 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
10180 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
10190 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
101a0 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
101b0 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
101c0 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
101d0 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
101e0 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
101f0 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
10200 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
10210 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10220 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
10230 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
10240 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
10250 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
10260 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10270 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
10280 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
10290 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
102a0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
102b0 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
102c0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
102d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
102e0 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
102f0 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
10300 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
10310 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10320 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
10330 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
10340 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
10350 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
10360 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
10370 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
10380 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
10390 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
103a0 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
103b0 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
103c0 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
103d0 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
103e0 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
103f0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
10400 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
10410 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
10420 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
10430 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
10440 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
10450 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
10460 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
10470 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
10480 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
10490 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
104a0 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
104b0 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
104c0 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
104d0 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
104e0 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
104f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
10500 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
10510 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
10520 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
10530 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
10540 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
10550 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
10560 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
10570 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
10580 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
10590 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
105a0 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
105b0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
105c0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
105d0 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
105e0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
105f0 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
10600 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
10610 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
10620 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
10630 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
10660 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
10690 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
106a0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
106b0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
106c0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
106d0 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
106e0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
106f0 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10710 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
10720 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
10730 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
10740 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10750 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
10760 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
10770 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ster */..  asser
10780 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
10790 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ster==0 );.  ass
107a0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
107b0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
107c0 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20 20  if( !zMaster .  
107d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
107e0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
107f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
10800 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  Y .   || pPager-
10810 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10820 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10830 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  OFF .  ){.    re
10840 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10850 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10860 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10870 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
10880 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
10890 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
108a0 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
108b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
108c0 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c   );..  /* Calcul
108d0 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69  ate the length i
108e0 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20  n bytes and the 
108f0 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73  checksum of zMas
10900 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61  ter */.  for(nMa
10910 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b  ster=0; zMaster[
10920 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65  nMaster]; nMaste
10930 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  r++){.    cksum 
10940 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  += zMaster[nMast
10950 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er];.  }..  /* I
10960 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
10970 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
10980 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
10990 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
109a0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
109b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
109c0 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
109d0 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
109e0 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
109f0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
10a00 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
10a10 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
10a20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
10a30 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
10a40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
10a50 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
10a60 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
10a70 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
10a80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
10a90 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
10aa0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61  aster journal da
10ab0 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ta to the end of
10ac0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10ad0 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72  e. If.  ** an er
10ae0 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
10af0 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
10b00 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
10b10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21  .  */.  if( (0 !
10b20 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10b30 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10b40 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f   iHdrOff, PAGER_
10b50 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
10b60 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10b70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10b80 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
10b90 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65   zMaster, nMaste
10ba0 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a  r, iHdrOff+4))).
10bb0 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10bc0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
10bd0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10be0 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d  ff+4+nMaster, nM
10bf0 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28  aster))).   || (
10c00 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10c10 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10c20 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10c30 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29  aster+4, cksum))
10c40 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10c50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10c60 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10c70 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
10c80 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
10c90 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
10ca0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10cb0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
10cc0 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
10cd0 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
10ce0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10cf0 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
10d00 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
10d10 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
10d20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
10d30 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
10d40 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
10d50 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
10d60 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
10d70 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
10d80 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
10d90 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
10da0 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
10db0 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
10dc0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
10dd0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
10de0 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
10df0 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
10e00 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
10e10 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
10e20 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
10e30 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
10e40 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
10e50 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
10e60 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
10e70 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
10e80 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
10e90 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
10ea0 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
10eb0 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
10ec0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
10ed0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
10ee0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
10ef0 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
10f00 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
10f10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10f20 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
10f30 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
10f40 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10f50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10f60 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
10f70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
10f80 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
10f90 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
10fa0 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
10fb0 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  er. Return.** a 
10fc0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
10fd0 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  age or NULL if t
10fe0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
10ff0 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72  e is not .** alr
11000 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a  eady in memory..
11010 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
11020 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
11030 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
11040 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
11050 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11070 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
11080 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
11090 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63  possible for a c
110a0 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74  all to PcacheFet
110b0 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65  ch() with create
110c0 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20  Flag==0 to.  ** 
110d0 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61  fail, since no a
110e0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
110f0 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  te dynamic memor
11100 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a  y will be made..
11110 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c    */.  (void)sql
11120 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
11130 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
11140 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20   pgno, 0, &p);. 
11150 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
11160 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20  .** Discard the 
11170 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
11180 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
11190 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a   page-cache..*/.
111a0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
111b0 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
111c0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
111d0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
111e0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
111f0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
11200 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
11210 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
11220 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74   Free all struct
11230 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65  ures in the Page
11240 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61  r.aSavepoint[] a
11250 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74  rray and set bot
11260 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65  h.** Pager.aSave
11270 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e  point and Pager.
11280 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65  nSavepoint to ze
11290 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75  ro. Close the su
112a0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20  b-journal.** if 
112b0 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  it is open and t
112c0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
112d0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
112e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
112f0 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65  d releaseAllSave
11300 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50  points(Pager *pP
11310 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b  ager){.  int ii;
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11330 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c  * Iterator for l
11340 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50  ooping through P
11350 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
11360 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
11370 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
11380 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
11390 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
113a0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
113b0 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
113c0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
113d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
113e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
113f0 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
11400 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
11410 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11420 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11430 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11440 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
11450 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
11460 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
11470 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
11480 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
11490 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
114a0 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
114b0 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
114c0 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
114d0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
114e0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
114f0 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
11500 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11510 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11520 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
11530 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
11540 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
11550 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
11560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
11570 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
11580 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
11590 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
115a0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
115b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
115c0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
115d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
115e0 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
115f0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
11600 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11610 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11620 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
11630 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
11640 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11650 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
11660 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
11670 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
11680 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
11690 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
116a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
116b0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
116c0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
116d0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
116e0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
116f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11700 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11710 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11720 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11730 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
11740 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11750 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
11760 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
11770 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
11780 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
11790 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
117a0 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
117b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
117c0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
117d0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
117e0 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
117f0 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
11800 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
11810 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
11820 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
11830 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
11840 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
11850 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
11860 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
11870 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
11880 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
11890 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
118a0 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
118b0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
118c0 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
118d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
118e0 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
118f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11900 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
11910 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
11920 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
11930 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
11940 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
11950 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
11960 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
11970 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
11980 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
11990 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
119a0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
119b0 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
119c0 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
119d0 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
119e0 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
119f0 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
11a00 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
11a10 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
11a20 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
11a30 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
11a40 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
11a50 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
11a60 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
11a70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11a80 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
11a90 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
11aa0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
11ab0 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
11ac0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11ad0 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
11ae0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11af0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
11b00 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
11b10 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
11b20 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41   = 0;.  releaseA
11b30 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
11b40 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ger);..  if( pag
11b50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
11b60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11b70 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
11b80 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  jfd) );.    sqli
11b90 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
11ba0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
11bb0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  >pWal);.    pPag
11bc0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
11bd0 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  ER_OPEN;.  }else
11be0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11bf0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
11c00 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72   /* Error code r
11c30 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72  eturned by pager
11c40 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20  UnlockDb() */.  
11c50 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
11c60 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
11c70 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
11c80 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
11c90 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
11ca0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
11cb0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
11cc0 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
11cd0 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
11ce0 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
11cf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11d00 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
11d10 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
11d20 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
11d30 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
11d40 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
11d50 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
11d60 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
11d70 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
11d80 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
11d90 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
11da0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11db0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
11dc0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11dd0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11de0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
11df0 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11e00 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11e10 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
11e20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
11e30 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11e40 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
11e50 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
11e60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11e70 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11e80 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
11e90 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11ea0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11eb0 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
11ec0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
11ed0 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
11ee0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
11ef0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
11f00 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
11f10 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
11f20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
11f30 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11f40 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
11f50 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
11f60 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
11f70 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
11f80 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  d the call to un
11f90 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
11fa0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61  e.    ** file fa
11fb0 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72  ils, set the cur
11fc0 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b  rent lock to UNK
11fd0 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
11fe0 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a  he comment.    *
11ff0 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  * above the #def
12000 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f  ine for UNKNOWN_
12010 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
12020 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74  anation of why t
12030 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65  his.    ** is ne
12040 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
12050 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
12060 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e  lockDb(pPager, N
12070 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
12080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
12090 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
120a0 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b  ==PAGER_ERROR ){
120b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
120c0 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c  Lock = UNKNOWN_L
120d0 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OCK;.    }..    
120e0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61  /* The pager sta
120f0 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65  te may be change
12100 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52  d from PAGER_ERR
12110 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  OR to PAGER_OPEN
12120 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74   here.    ** wit
12130 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68  hout clearing th
12140 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
12150 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61  is is intentiona
12160 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20  l - the error.  
12170 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65    ** code is cle
12180 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  ared and the cac
12190 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20  he reset in the 
121a0 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20  block below..   
121b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
121c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
121d0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
121e0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
121f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
12200 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
12210 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
12220 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12230 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EN;.  }..  /* If
12240 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
12250 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
12260 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
12270 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
12280 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e  .  ** trusted. N
12290 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ow that there ar
122a0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
122b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
122c0 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69  he pager,.  ** i
122d0 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76  t can safely mov
122e0 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  e back to PAGER_
122f0 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73  OPEN state. This
12300 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68   happens in both
12310 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64  .  ** normal and
12320 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
12330 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng mode..  */.  
12340 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
12350 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ode ){.    asser
12360 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
12370 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
12380 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
12390 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
123a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
123b0 46 69 6c 65 3b 0a 20 20 20 20 70 50 61 67 65 72  File;.    pPager
123c0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
123d0 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50 61 67 65  _OPEN;.    pPage
123e0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
123f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
12400 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12410 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
12420 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
12430 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
12440 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  ster = 0;.}../*.
12450 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12460 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
12470 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20  ver an IOERR or 
12480 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20  FULL error that 
12490 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20  requires.** the 
124a0 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74  pager to transit
124b0 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52  ion into the ERR
124c0 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76  OR state may ahv
124d0 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54  e occurred..** T
124e0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
124f0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
12500 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
12510 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
12520 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d  d .** the error-
12530 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
12540 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
12550 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
12560 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65  n. The .** value
12570 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
12580 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
12590 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
125a0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
125b0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
125c0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
125d0 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
125e0 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
125f0 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73  f the.** IOERR s
12600 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61  ub-codes, the pa
12610 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
12620 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
12630 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
12640 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61   is stored in Pa
12650 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69  ger.errCode. Whi
12660 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d  le the pager rem
12670 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f  ains in the ERRO
12680 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20  R state,.** all 
12690 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20  major API calls 
126a0 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c  on the Pager wil
126b0 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
126c0 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  turn Pager.errCo
126d0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52  de..**.** The ER
126e0 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61  ROR state indica
126f0 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
12700 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12710 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
12720 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
12730 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
12740 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
12750 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
12760 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
12770 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
12780 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
12790 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
127a0 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
127b0 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
127c0 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
127d0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
127e0 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
127f0 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
12800 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
12810 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
12820 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
12830 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
12840 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
12850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
12860 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
12870 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
12880 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
12890 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
128a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
128b0 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
128c0 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
128d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
128e0 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
128f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
12900 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
12910 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
12920 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
12930 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
12940 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
12950 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
12960 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
12970 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
12980 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
12990 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
129a0 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b  e = PAGER_ERROR;
129b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
129c0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
129d0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
129e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
129f0 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a  no nPage);../*.*
12a00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
12a10 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
12a20 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  n. A transaction
12a30 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65   is usually ende
12a40 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20  d by .** either 
12a50 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
12a60 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e  LLBACK operation
12a70 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
12a80 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a  ay be called .**
12a90 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20   after rollback 
12aa0 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
12ab0 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
12ac0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70   occurs while op
12ad0 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75  ening.** the jou
12ae0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69  rnal file or wri
12af0 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69  ting the very fi
12b00 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
12b10 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62  er of a.** datab
12b20 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ase transaction.
12b30 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
12b40 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
12b50 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52  lled in PAGER_ER
12b60 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74  ROR state. If it
12b70 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e   is called.** in
12b80 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50   PAGER_NONE or P
12b90 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
12ba0 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68  e and the lock h
12bb0 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65  eld is less.** e
12bc0 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20  xclusive than a 
12bd0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69  RESERVED lock, i
12be0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
12bf0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
12c00 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  ny active savepo
12c10 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65  ints are release
12c20 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
12c30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12c40 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73  open, then it is
12c50 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e   "finalized". On
12c60 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ce a journal .**
12c70 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66   file has been f
12c80 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e  inalized it is n
12c90 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
12ca0 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61  se it to roll ba
12cb0 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63  ck a .** transac
12cc0 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69  tion. Nor will i
12cd0 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  t be considered 
12ce0 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72  to be a hot-jour
12cf0 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f  nal by this.** o
12d00 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  r any other data
12d10 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
12d20 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a   Exactly how a j
12d30 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
12d40 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f  zed.** depends o
12d50 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
12d60 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
12d70 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
12d80 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74  ve mode and.** t
12d90 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e  he current journ
12da0 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a  al-mode (Pager.j
12db0 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65  ournalMode value
12dc0 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ), as follows:.*
12dd0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
12de0 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20  de==MEMORY.**   
12df0 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64    Journal file d
12e00 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d  escriptor is sim
12e10 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  ply closed. This
12e20 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a   destroys an .**
12e30 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a       in-memory j
12e40 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20  ournal..**.**   
12e50 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55  journalMode==TRU
12e60 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75  NCATE.**     Jou
12e70 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75  rnal file is tru
12e80 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62  ncated to zero b
12e90 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
12ea0 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12eb0 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20  e==PERSIST.**   
12ec0 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62    The first 28 b
12ed0 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
12ee0 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72  nal file are zer
12ef0 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69  oed. This invali
12f00 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65  dates.**     the
12f10 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
12f20 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c  eader in the fil
12f30 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65  e, and hence the
12f40 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a   entire journal.
12f50 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20  **     file. An 
12f60 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20  invalid journal 
12f70 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  file cannot be r
12f80 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
12f90 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12fa0 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54  =DELETE.**     T
12fb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12fc0 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  is closed and de
12fd0 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  leted using sqli
12fe0 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
12ff0 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20  *.**     If the 
13000 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
13010 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13020 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20  de, this method 
13030 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a  of finalizing.**
13040 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
13050 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75   file is never u
13060 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66  sed. Instead, if
13070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65   the journalMode
13080 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54   is.**     DELET
13090 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  E and the pager 
130a0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
130b0 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64  mode, the method
130c0 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72   described under
130d0 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d  .**     journalM
130e0 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20  ode==PERSIST is 
130f0 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
13100 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f  .** After the jo
13110 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
13120 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f  ed, the pager mo
13130 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41  ves to PAGER_REA
13140 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66  DER state..** If
13150 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
13160 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61  exclusive rollba
13170 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63  ck mode, the loc
13180 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73  k on the file is
13190 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20   .** downgraded 
131a0 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b  to a SHARED_LOCK
131b0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
131c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
131d0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
131e0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
131f0 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61  curs during.** a
13200 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65  ny of the IO ope
13210 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c  rations to final
13220 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
13230 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  file or unlock t
13240 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  he.** database t
13250 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
13260 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
13270 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49  d to the user. I
13280 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74  f the .** operat
13290 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ion to finalize 
132a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
132b0 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
132c0 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74   code still.** t
132d0 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  ries to unlock t
132e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
132f0 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   if not in exclu
13300 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  sive mode. If th
13310 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  e.** unlock oper
13320 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77  ation fails as w
13330 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ell, then the fi
13340 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72  rst error code r
13350 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  elated.** to the
13360 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63   first error enc
13370 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f  ountered (the jo
13380 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
13390 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65  on one) is.** re
133a0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
133b0 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
133c0 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
133d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
133e0 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43  asMaster, int bC
133f0 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63  ommit){.  int rc
13400 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13410 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
13420 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69   from journal fi
13430 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61  nalization opera
13440 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
13450 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  2 = SQLITE_OK;  
13460 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
13470 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e   from db file un
13480 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a  lock operation *
13490 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69  /..  /* Do nothi
134a0 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ng if the pager 
134b0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e  does not have an
134c0 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
134d0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20  saction.  ** or 
134e0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
134f0 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66  VED lock. This f
13500 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
13510 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
13520 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74  .  ** is no writ
13530 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
13540 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45 52  tive but a RESER
13550 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
13560 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64  ock is.  ** held
13570 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75   under two circu
13580 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20  mstances:.  **. 
13590 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61   **   1. After a
135a0 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d   successful hot-
135b0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
135c0 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77  , it is called w
135d0 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53  ith.  **      eS
135e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45  tate==PAGER_NONE
135f0 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
13600 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a  USIVE_LOCK..  **
13610 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20  .  **   2. If a 
13620 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
13630 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
13640 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61  lusive holding a
13650 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a  n EXCLUSIVE .  *
13660 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74  *      lock swit
13670 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63  ches back to loc
13680 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c  king_mode=normal
13690 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74   and then execut
136a0 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72  es a.  **      r
136b0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ead-transaction,
136c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
136d0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53  s called with eS
136e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
136f0 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e  ER .  **      an
13700 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
13710 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  VE_LOCK when the
13720 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13730 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a  n is closed..  *
13740 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  /.  assert( asse
13750 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
13760 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
13770 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
13780 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
13790 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
137a0 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52  >eState<PAGER_WR
137b0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70  ITER_LOCKED && p
137c0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53  Pager->eLock<RES
137d0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
137e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
137f0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61  OK;.  }..  relea
13800 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
13810 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
13820 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
13830 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
13840 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
13850 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
13860 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
13870 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
13880 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13890 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61   );..    /* Fina
138a0 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
138b0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
138c0 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f  ( sqlite3IsMemJo
138d0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
138e0 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  d) ){.      asse
138f0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
13900 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13910 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13920 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y );.      sqlit
13930 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13940 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
13950 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
13960 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13970 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
13980 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
13990 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
139a0 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
139b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
139c0 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
139d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
139e0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
139f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
13a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13a10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13a20 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
13a30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13a40 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
13a50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
13a60 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  IST.      || (pP
13a70 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
13a80 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ode && pPager->j
13a90 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
13aa0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
13ab0 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  L).    ){.      
13ac0 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
13ad0 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
13ae0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 50  aster);.      pP
13af0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13b00 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
13b10 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
13b20 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65  ranch may be exe
13b30 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72  cuted with Pager
13b40 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45  .journalMode==ME
13b50 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a  MORY if.      **
13b60 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
13b70 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62  as just rolled b
13b80 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
13b90 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  e the journal.  
13ba0 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75      ** file shou
13bb0 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ld be closed and
13bc0 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
13bd0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
13be0 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  tes to.      ** 
13bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13c00 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f  e, it will do so
13c10 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d   using an in-mem
13c20 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  ory journal. .  
13c30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
13c40 20 62 44 65 6c 65 74 65 20 3d 20 28 21 70 50 61   bDelete = (!pPa
13c50 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
13c60 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 45   sqlite3JournalE
13c70 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  xists(pPager->jf
13c80 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
13c90 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13ca0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13cb0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
13cc0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13cd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13ce0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13cf0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
13d00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
13d10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13d20 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13d30 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
13d40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13d50 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
13d60 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
13d70 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
13d80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13d90 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
13da0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
13db0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
13dc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
13dd0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
13de0 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
13df0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
13e00 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
13e10 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
13e20 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
13e30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
13e40 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
13e50 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
13e60 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
13e70 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
13e80 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
13e90 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ger, 1);.    if(
13ea0 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70   p ){.      p->p
13eb0 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  ageHash = 0;.   
13ec0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
13ed0 6e 72 65 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20  nref(p);.    }. 
13ee0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
13ef0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
13f00 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
13f10 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
13f20 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
13f30 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
13f40 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  = 0;.  sqlite3Pc
13f50 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
13f60 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
13f70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
13f80 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
13f90 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
13fa0 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  dbSize);..  if( 
13fb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
13fc0 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72  er) ){.    /* Dr
13fd0 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65  op the WAL write
13fe0 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41  -lock, if any. A
13ff0 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e  lso, if the conn
14000 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20  ection was in . 
14010 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f     ** locking_mo
14020 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
14030 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e but is no long
14040 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43  er, drop the EXC
14050 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c  LUSIVE .    ** l
14060 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
14070 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
14080 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20     */.    rc2 = 
14090 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69  sqlite3WalEndWri
140a0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
140b0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
140c0 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51   assert( rc2==SQ
140d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c  LITE_OK );.  }el
140e0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
140f0 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14100 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  && pPager->dbFil
14110 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  eSize>pPager->db
14120 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Size ){.    /* T
14130 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
14140 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ken when committ
14150 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
14160 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  n in rollback-jo
14170 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64  urnal.    ** mod
14180 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
14190 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
141a0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
141b0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
141c0 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  ..    ** At this
141d0 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e   point the journ
141e0 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  al has been fina
141f0 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72  lized and the tr
14200 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
14210 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  * successfully c
14220 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68  ommitted, but th
14230 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
14240 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
14250 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c  n the.    ** fil
14260 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65  e. So it is safe
14270 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
14280 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
14290 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20  o its minimum.  
142a0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69    ** required si
142b0 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ze.  */.    asse
142c0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
142d0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
142e0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
142f0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
14300 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ger, pPager->dbS
14310 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
14320 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
14330 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28  iveMode .   && (
14340 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
14350 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57  ger) || sqlite3W
14360 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
14370 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29  pPager->pWal, 0)
14380 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ).  ){.    rc2 =
14390 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
143a0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
143b0 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
143c0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
143d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
143e0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
143f0 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61  ER_READER;.  pPa
14400 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
14410 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72   0;..  return (r
14420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
14430 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  :rc);.}../*.** E
14440 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
14450 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
14460 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
14470 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
14480 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
14490 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
144a0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
144b0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
144c0 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61   state, do not a
144d0 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72  ttempt .** the r
144e0 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20  ollback at this 
144f0 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70  time. Instead, p
14500 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
14510 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20   called. The.** 
14520 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
14530 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63  lock() will disc
14540 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
14550 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a  y pages, unlock.
14560 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14570 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  file and move th
14580 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20  e pager back to 
14590 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74  OPEN state. If t
145a0 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  his .** means th
145b0 61 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  at there is a ho
145c0 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69  t-journal left i
145d0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
145e0 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20  m, the next .** 
145f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62  connection to ob
14600 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
14610 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ck on the pager 
14620 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68  (which may be th
14630 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c  is one) .** will
14640 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
14650 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14660 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  r has not alread
14670 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52  y entered the ER
14680 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61  ROR state, but a
14690 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f  n IO or.** mallo
146a0 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  c error occurs d
146b0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
146c0 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c  , then this will
146d0 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a   itself cause .*
146e0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  * the pager to e
146f0 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73  nter the ERROR s
14700 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c  tate. Which will
14710 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74   be cleared by t
14720 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
14730 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73  ger_unlock(), as
14740 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
14750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14760 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
14770 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
14780 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
14790 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
147a0 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61  GER_ERROR && pPa
147b0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
147c0 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61  ER_OPEN ){.    a
147d0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
147e0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
147f0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ) );.    if( pPa
14800 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
14810 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
14820 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14830 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
14840 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oc();.      sqli
14850 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
14860 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14870 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
14880 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65  Malloc();.    }e
14890 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
148a0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
148b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
148c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
148d0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
148e0 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f        pager_end_
148f0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
14900 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  er, 0, 0);.    }
14910 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
14920 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  ock(pPager);.}..
14930 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
14940 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74  aData must point
14950 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
14960 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14970 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
14980 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  a. Compute and r
14990 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
149a0 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63   based ont the c
149b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
149c0 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20  ** page of data 
149d0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
149e0 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d  value of pPager-
149f0 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a  >cksumInit..**.*
14a00 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
14a10 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49  real checksum. I
14a20 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
14a30 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
14a40 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
14a50 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72  al value (pPager
14a60 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64  ->cksumInit) and
14a70 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74   every 200th byt
14a80 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
14a90 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20   data, starting 
14aa0 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74  with byte offset
14ab0 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
14ac0 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68  ze%200)..** Each
14ad0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
14ae0 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74  eted as an 8-bit
14af0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
14b00 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e  r..**.** Changin
14b10 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73  g the formula us
14b20 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
14b30 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75  is checksum resu
14b40 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63  lts in an.** inc
14b50 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61  ompatible journa
14b60 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a  l file format..*
14b70 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20  *.** If journal 
14b80 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
14b90 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
14ba0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
14bb0 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63  st likely .** sc
14bc0 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f  enario is that o
14bd0 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
14be0 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
14bf0 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
14c00 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63  d. .** It is muc
14c10 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
14c20 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
14c30 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
14c40 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
14c50 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
14c60 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
14c70 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
14c80 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
14c90 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
14ca0 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
14cb0 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
14cc0 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
14cd0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
14ce0 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
14cf0 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
14d00 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
14d10 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
14d20 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
14d30 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
14d40 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75  /* Checksum valu
14d50 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
14d60 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
14d70 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20  >pageSize-200;  
14d80 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
14d90 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69  counter */.  whi
14da0 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
14db0 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
14dc0 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
14dd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
14de0 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  um;.}../*.** Rep
14df0 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  ort the current 
14e00 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75  page size and nu
14e10 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
14e20 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74   bytes back.** t
14e30 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a  o the codec..*/.
14e40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
14e50 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76  S_CODEC.static v
14e60 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53  oid pagerReportS
14e70 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
14e80 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
14e90 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
14ea0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
14eb0 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70  xCodecSizeChng(p
14ec0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70  Pager->pCodec, p
14ed0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
14ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
14f00 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76  )pPager->nReserv
14f10 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  e);.  }.}.#else.
14f20 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65  # define pagerRe
14f30 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20  portSize(X)     
14f40 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64  /* No-op if we d
14f50 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20  o not support a 
14f60 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a  codec */.#endif.
14f70 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
14f80 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65  ngle page from e
14f90 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  ither the journa
14fa0 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69  l file (if isMai
14fb0 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20  nJrnl==1) or.** 
14fc0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
14fd0 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a  rnal (if isMainJ
14fe0 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79  rnl==0) and play
14ff0 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a  back that page..
15000 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69  ** The page begi
15010 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f  ns at offset *pO
15020 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
15030 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65  ile. The *pOffse
15040 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e  t.** value is in
15050 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73  creased to the s
15060 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
15070 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
15080 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
15090 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
150a0 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b  urnal uses check
150b0 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65  sums - the state
150c0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  ment journal doe
150d0 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  s .** not..**.**
150e0 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
150f0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
15100 72 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d  record read from
15110 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15120 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  al file.** is gr
15130 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
15140 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
15150 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
15160 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a  en playback is.*
15170 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51  * skipped and SQ
15180 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
15190 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ned..**.** If pD
151a0 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  one is not NULL,
151b0 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65   then it is a re
151c0 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68  cord of pages th
151d0 61 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  at have already.
151e0 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  ** been played b
151f0 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67  ack.  If the pag
15200 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61  e at *pOffset ha
15210 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
15220 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69  layed back.** (i
15230 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
15240 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73  ing pDone bit is
15250 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20   set) then skip 
15260 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a  the playback..**
15270 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
15280 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70  Done bit corresp
15290 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70  onding to the *p
152a0 4f 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73  Offset page is s
152b0 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72  et.** prior to r
152c0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
152d0 49 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  If the page reco
152e0 72 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  rd is successful
152f0 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
15300 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15310 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65  ile.** and playe
15320 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c  d back, then SQL
15330 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15340 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
15350 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69  or occurs.** whi
15360 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72  le reading the r
15370 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28  ecord from the (
15380 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
15390 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69  e or while writi
153a0 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  ng.** to the dat
153b0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
153c0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
153d0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
153e0 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75  If data.** is su
153f0 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
15400 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20  ournal file but 
15420 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a  appears to be.**
15430 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
15440 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
15450 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e  ned. Data is con
15460 73 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65  sidered corrupte
15470 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63  d in.** two circ
15480 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a  umstances:.** .*
15490 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
154a0 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ord page-number 
154b0 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72  is illegal (0 or
154c0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c   PAGER_MJ_PGNO),
154d0 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68   or.**   * If th
154e0 65 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e  e record is bein
154f0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72  g rolled back fr
15500 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
15510 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
15520 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
15530 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20   field does not 
15540 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64  match the record
15550 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
15560 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65  Neither of these
15570 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61   two scenarios a
15580 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69  re possible duri
15590 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  ng a savepoint r
155a0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
155b0 66 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65  f this is a save
155c0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20  point rollback, 
155d0 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20  then memory may 
155e0 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d  have to be dynam
155f0 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
15600 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
15610 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73  tion. If this is
15620 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e   the case and an
15630 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
15640 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s,.** SQLITE_NOM
15650 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EM is returned..
15660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
15670 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
15680 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  _page(.  Pager *
15690 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
156a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
156b0 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64  ger being played
156c0 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a   back */.  i64 *
156d0 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20  pOffset,        
156e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
156f0 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  et of record to 
15700 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69  playback */.  Bi
15710 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20  tvec *pDone,    
15720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
15730 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
15740 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61  lready played ba
15750 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
15760 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
15770 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
15780 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
15790 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
157a0 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74  .  int isSavepnt
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157c0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73   /* True for a s
157d0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
157e0 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
157f0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
15820 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
15830 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
15840 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
15850 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
15860 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
15870 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
15880 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158a0 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
158b0 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
158c0 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  cking */.  char 
158d0 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *aData;         
158e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
158f0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f  orary storage fo
15900 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  r the page */.  
15910 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
15920 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
15930 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
15940 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75  ptor for the jou
15950 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
15960 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20  nt isSynced;    
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15980 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
15990 70 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a  page is synced *
159a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  /..  assert( (is
159b0 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20  MainJrnl&~1)==0 
159c0 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69  );      /* isMai
159d0 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20  nJrnl is 0 or 1 
159e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  */.  assert( (is
159f0 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29  Savepnt&~1)==0 )
15a00 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76  ;       /* isSav
15a10 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a  epnt is 0 or 1 *
15a20 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61  /.  assert( isMa
15a30 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20  inJrnl || pDone 
15a40 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20  );     /* pDone 
15a50 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73  always used on s
15a60 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
15a70 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
15a80 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29  nt || pDone==0 )
15a90 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76  ;   /* pDone nev
15aa0 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73  er used on non-s
15ab0 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61  avepoint */..  a
15ac0 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70  Data = pPager->p
15ad0 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65  TmpSpace;.  asse
15ae0 72 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20  rt( aData );    
15af0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
15b00 72 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  rage must have a
15b10 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
15b20 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  cated */.  asser
15b30 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
15b40 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69  Pager)==0 || (!i
15b50 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53  sMainJrnl && isS
15b60 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a  avepnt) );..  /*
15b70 20 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74   Either the stat
15b80 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
15b90 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  n PAGER_WRITER_C
15ba0 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73  ACHEMOD (a trans
15bb0 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20  action .  ** or 
15bc0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15bd0 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72  ck done at the r
15be0 65 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61  equest of the ca
15bf0 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73  ller) or this is
15c00 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72  .  ** a hot-jour
15c10 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66  nal rollback. If
15c20 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75   it is a hot-jou
15c30 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  rnal rollback, t
15c40 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73  he pager.  ** is
15c50 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61   in state OPEN a
15c60 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c  nd holds an EXCL
15c70 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d  USIVE lock. Hot-
15c80 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
15c90 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73  .  ** only reads
15ca0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
15cb0 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20  ournal, not the 
15cc0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  sub-journal..  *
15cd0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
15ce0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
15cf0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
15d00 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  D.       || (pPa
15d10 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
15d20 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65  ER_OPEN && pPage
15d30 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
15d40 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20  IVE_LOCK).  );. 
15d50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15d60 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
15d70 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c  RITER_CACHEMOD |
15d80 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a  | isMainJrnl );.
15d90 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
15da0 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
15db0 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
15dc0 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
15dd0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
15de0 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
15df0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
15e00 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
15e10 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
15e20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
15e30 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
15e40 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
15e50 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
15e60 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
15e70 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
15e80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15e90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15ea0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
15eb0 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
15ec0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
15ed0 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
15ee0 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
15ef0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
15f00 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
15f10 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
15f20 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
15f30 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
15f40 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
15f50 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
15f60 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
15f70 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
15f80 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
15f90 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
15fa0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
15fb0 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
15fc0 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
15fd0 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
15fe0 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
15ff0 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
16000 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
16010 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
16020 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
16030 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
16040 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
16050 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
16060 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
16070 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
16080 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
16090 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
160a0 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
160b0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
160c0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
160d0 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
160e0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
160f0 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
16100 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
16110 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
16120 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16130 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
16140 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
16150 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
16160 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
16170 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
16180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
16190 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
161a0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
161b0 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
161c0 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
161d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
161e0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
161f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
16200 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
16210 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66  en played by bef
16220 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
16230 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
16240 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
16250 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
16260 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
16270 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
16280 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
16290 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
162a0 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
162b0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
162c0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57   rc;.  }..  /* W
162d0 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b  hen playing back
162e0 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65   page 1, restore
162f0 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65   the nReserve se
16300 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28  tting.  */.  if(
16310 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67   pgno==1 && pPag
16320 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28  er->nReserve!=((
16330 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29  u8*)aData)[20] )
16340 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  {.    pPager->nR
16350 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61  eserve = ((u8*)a
16360 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70  Data)[20];.    p
16370 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
16380 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
16390 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
163a0 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74  s in CACHEMOD st
163b0 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
163c0 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
163d0 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
163e0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
163f0 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
16400 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
16410 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
16420 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
16430 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
16440 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
16450 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
16460 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
16470 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
16480 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
16490 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
164a0 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
164b0 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
164c0 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
164d0 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
164e0 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
164f0 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
16500 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
16510 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
16520 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
16530 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
16540 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
16550 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
16560 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
16570 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
16580 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
16590 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
165a0 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
165b0 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
165c0 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
165d0 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
165e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
165f0 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20  n WRITER_DBMOD, 
16600 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
16610 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
16620 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
16630 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63  e.  ** pager cac
16640 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  he if it exists 
16650 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
16660 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
16670 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a  hen marked .  **
16680 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63   not dirty. Sinc
16690 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f  e this code is o
166a0 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20  nly executed in 
166b0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
166c0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d   for.  ** a hot-
166d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
166e0 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
166f0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
16700 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a  -cache is empty.
16710 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
16720 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61  r is in OPEN sta
16730 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  te..  **.  ** Ti
16740 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
16750 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
16760 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
16770 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
16780 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
16790 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
167a0 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
167b0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
167c0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
167d0 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
167e0 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
167f0 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
16800 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
16810 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
16820 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
16830 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
16840 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
16850 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
16860 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
16870 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
16880 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
16890 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
168a0 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
168b0 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
168c0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
168d0 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
168e0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
168f0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
16900 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
16910 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
16920 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
16930 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
16940 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16950 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
16960 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
16970 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
16980 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
16990 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
169a0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
169b0 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
169c0 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
169d0 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
169e0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
169f0 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
16a00 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
16a10 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
16a20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
16a30 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
16a40 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
16a50 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
16a60 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
16a70 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
16a80 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
16a90 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
16aa0 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
16ab0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
16ac0 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
16ad0 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
16ae0 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
16af0 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
16b00 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
16b10 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
16b20 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
16b30 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
16b40 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
16b50 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
16b60 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
16b70 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
16b80 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
16b90 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
16ba0 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
16bb0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
16bc0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
16bd0 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
16be0 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  e{.    pPg = pag
16bf0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
16c00 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61  , pgno);.  }.  a
16c10 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d  ssert( pPg || !M
16c20 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
16c30 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
16c40 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  !=PAGER_OPEN || 
16c50 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45  pPg==0 );.  PAGE
16c60 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43  RTRACE(("PLAYBAC
16c70 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  K %d page %d has
16c80 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20  h(%08x) %s\n",. 
16c90 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
16ca0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
16cb0 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
16cc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16cd0 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20  , (u8*)aData),. 
16ce0 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69            (isMai
16cf0 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72  nJrnl?"main-jour
16d00 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61  nal":"sub-journa
16d10 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  l").  ));.  if( 
16d20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
16d30 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61    isSynced = pPa
16d40 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28  ger->noSync || (
16d50 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67  *pOffset <= pPag
16d60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
16d70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
16d80 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30  Synced = (pPg==0
16d90 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
16da0 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
16db0 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66  SYNC));.  }.  if
16dc0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
16dd0 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67  >fd).   && (pPag
16de0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
16df0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
16e00 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
16e10 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20  ==PAGER_OPEN).  
16e20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29   && isSynced.  )
16e30 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
16e40 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
16e50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
16e60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21  .    testcase( !
16e70 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67  isSavepnt && pPg
16e80 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61  !=0 && (pPg->fla
16e90 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
16ea0 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  NC)!=0 );.    as
16eb0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
16ec0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
16ed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16ee0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
16ef0 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70  , (u8 *)aData, p
16f00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
16f10 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20   ofst);.    if( 
16f20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
16f30 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
16f40 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
16f50 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
16f60 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
16f70 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
16f80 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
16f90 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  , aData, pgno, 3
16fa0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
16fb0 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  M);.      sqlite
16fc0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
16fd0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
16fe0 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29  gno, (u8*)aData)
16ff0 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  ;.      CODEC2(p
17000 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
17010 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45  no, 7, rc=SQLITE
17020 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a  _NOMEM, aData);.
17030 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
17040 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
17050 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
17060 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
17070 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
17080 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
17090 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
170a0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
170b0 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
170c0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
170d0 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
170e0 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
170f0 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
17100 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
17110 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
17120 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
17130 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
17140 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
17150 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
17160 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
17170 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
17180 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
17190 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
171a0 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
171b0 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
171c0 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
171d0 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
171e0 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
171f0 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
17200 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
17210 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
17220 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
17230 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
17240 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
17250 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
17260 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
17270 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
17280 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
17290 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
172a0 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
172b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
172c0 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
172d0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
172e0 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
172f0 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
17300 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
17310 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
17320 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
17330 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
17340 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
17350 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
17360 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
17370 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
17380 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
17390 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
173a0 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
173b0 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
173c0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
173d0 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
173e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
173f0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30  r->doNotSpill==0
17400 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
17410 64 6f 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20  doNotSpill++;.  
17420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17430 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
17440 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
17450 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17460 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
17470 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  l==1 );.    pPag
17480 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d  er->doNotSpill--
17490 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
174a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
174b0 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c   rc;.    pPg->fl
174c0 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
174d0 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
174e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
174f0 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
17500 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
17510 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
17520 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
17530 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
17540 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
17550 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
17560 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
17570 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
17580 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
17590 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
175a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
175b0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
175c0 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
175d0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
175e0 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
175f0 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
17600 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
17610 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
17620 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
17630 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
17640 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
17650 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
17660 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
17670 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
17680 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
17690 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
176a0 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
176b0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
176c0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61  g);.    if( isMa
176d0 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
176e0 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
176f0 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
17700 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
17710 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
17720 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
17730 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
17740 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
17750 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
17760 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
17770 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
17780 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
17790 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
177a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
177b0 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
177c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
177d0 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
177e0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
177f0 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
17800 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
17810 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
17820 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
17830 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
17840 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
17850 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
17860 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
17870 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
17880 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
17890 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
178a0 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
178b0 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
178c0 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
178d0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
178e0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
178f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
17900 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
17910 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
17920 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
17930 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
17940 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
17950 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
17960 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
17970 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
17980 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
17990 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
179a0 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
179b0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
179c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
179d0 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
179e0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
179f0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
17a00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17a10 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
17a20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
17a30 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
17a40 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
17a50 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
17a60 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
17a70 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
17a80 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
17a90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
17aa0 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
17ab0 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
17ac0 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
17ad0 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
17ae0 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
17af0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
17b00 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
17b10 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
17b20 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
17b30 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
17b40 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
17b50 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
17b60 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
17b70 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
17b80 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sue..      */.  
17b90 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
17ba0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
17bb0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17bc0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
17bd0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
17be0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
17bf0 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
17c00 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
17c10 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
17c20 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
17c30 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
17c40 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
17c50 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
17c60 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
17c70 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
17c80 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
17c90 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
17ca0 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
17cb0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
17cc0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
17cd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
17ce0 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
17cf0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
17d00 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
17d10 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
17d20 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
17d30 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
17d40 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
17d50 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
17d60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17d70 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
17d80 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
17d90 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
17da0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
17db0 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
17dc0 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
17dd0 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
17de0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
17df0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
17e00 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
17e10 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
17e20 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
17e30 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
17e40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17e50 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
17e60 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
17e70 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
17e80 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
17e90 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
17ea0 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
17eb0 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
17ec0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
17ed0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
17ee0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
17ef0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
17f00 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
17f10 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
17f20 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
17f30 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
17f40 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
17f50 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
17f60 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
17f70 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
17f80 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
17f90 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
17fa0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
17fb0 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
17fc0 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
17fd0 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
17fe0 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
17ff0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
18000 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
18010 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
18020 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
18030 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
18040 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
18050 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
18060 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
18070 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
18080 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
18090 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
180a0 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
180b0 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
180c0 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
180d0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
180e0 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
180f0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
18100 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
18110 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
18120 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
18130 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
18140 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
18150 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
18160 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
18170 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
18180 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
18190 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
181a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
181b0 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
181c0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
181d0 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
181e0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
181f0 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
18200 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
18210 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
18220 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
18230 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
18240 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
18250 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
18260 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
18270 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
18280 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
18290 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
182a0 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
182b0 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
182c0 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
182d0 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
182e0 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
182f0 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
18300 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
18310 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
18320 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
18330 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
18340 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
18350 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
18360 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
18370 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
18380 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
18390 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
183a0 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
183b0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
183c0 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
183d0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
183e0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
183f0 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
18400 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
18410 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
18420 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
18430 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
18440 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
18450 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
18460 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
18470 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
18480 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
18490 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
184a0 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
184b0 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
184c0 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
184d0 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
184e0 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
184f0 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
18500 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
18510 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
18520 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
18530 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
18540 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
18550 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
18560 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18580 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
18590 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
185a0 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
185b0 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
185c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
185d0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
185e0 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
185f0 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
18600 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
18610 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18620 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
18630 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
18640 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
18650 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18660 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
18670 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
18680 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
18690 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
186a0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
186b0 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nal;           /
186c0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65  * Pointer to one
186d0 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20   journal within 
186e0 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  MJ file */.  cha
186f0 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20  r *zMasterPtr;  
18700 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
18710 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e  to hold MJ filen
18720 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e  ame from a journ
18730 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
18740 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20   nMasterPtr;    
18750 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74         /* Amount
18760 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
18770 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74  ted to zMasterPt
18780 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  r[] */..  /* All
18790 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
187a0 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61  both the pJourna
187b0 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69  l and pMaster fi
187c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a  le descriptors..
187d0 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66    ** If successf
187e0 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73  ul, open the mas
187f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18800 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20   for reading..  
18810 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28  */.  pMaster = (
18820 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73  sqlite3_file *)s
18830 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
18840 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
18850 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c  * 2);.  pJournal
18860 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
18870 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74   *)(((u8 *)pMast
18880 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73  er) + pVfs->szOs
18890 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d  File);.  if( !pM
188a0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20  aster ){.    rc 
188b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
188c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
188d0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  st int flags = (
188e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
188f0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
18900 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
18910 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18920 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
18930 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
18940 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
18950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18960 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
18970 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20  ster_out;..  /* 
18980 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
18990 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
189a0 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
189b0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a  btained from.  *
189c0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
189d0 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
189e0 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
189f0 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61  nal.   Also obta
18a00 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65  in.  ** sufficie
18a10 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61  nt space (in zMa
18a20 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64  sterPtr) to hold
18a30 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61   the names of ma
18a40 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ster.  ** journa
18a50 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65  l files extracte
18a60 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72  d from regular r
18a70 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73  ollback-journals
18a80 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
18a90 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
18aa0 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
18ab0 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
18ac0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18ad0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18ae0 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74  out;.  nMasterPt
18af0 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  r = pVfs->mxPath
18b00 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65  name+1;.  zMaste
18b10 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  rJournal = sqlit
18b20 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d  e3Malloc((int)nM
18b30 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
18b40 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
18b50 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
18b60 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
18b70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
18b80 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18b90 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d  er_out;.  }.  zM
18ba0 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
18bb0 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
18bc0 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20  erJournal+1];.  
18bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
18be0 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
18bf0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
18c00 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
18c10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
18c20 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18c30 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
18c40 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b   zMasterJournal[
18c50 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20  nMasterJournal] 
18c60 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c  = 0;..  zJournal
18c70 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
18c80 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  l;.  while( (zJo
18c90 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
18ca0 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
18cb0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
18cc0 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d  exists;.    rc =
18cd0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
18ce0 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
18cf0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
18d00 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
18d10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18d20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18d30 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18d40 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
18d50 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
18d60 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
18d70 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
18d80 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
18d90 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
18da0 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20  ..      ** Open 
18db0 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
18dc0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
18dd0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
18de0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c   If.      ** so,
18df0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
18e00 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
18e10 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18e20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18e30 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e   int c;.      in
18e40 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
18e50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
18e60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
18e70 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
18e80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
18e90 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
18ea0 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
18eb0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ags, 0);.      i
18ec0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
18ee0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18ef0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
18f00 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
18f10 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
18f20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
18f30 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73  terPtr);.      s
18f40 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
18f50 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
18f60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18f70 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
18f80 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18f90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
18fa0 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
18fb0 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
18fc0 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
18fd0 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  r)==0;.      if(
18fe0 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   c ){.        /*
18ff0 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
19000 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
19010 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19020 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
19030 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
19040 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
19050 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e      }.    zJourn
19060 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
19070 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
19080 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c  +1);.  }. .  sql
19090 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
190a0 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ter);.  rc = sql
190b0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
190c0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
190d0 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
190e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
190f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
19100 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
19110 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
19120 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
19130 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
19140 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
19150 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19160 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
19170 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
19180 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19190 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  on is used to ch
191a0 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20  ange the actual 
191b0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
191c0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e  base .** file in
191d0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
191e0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  . This only happ
191f0 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ens when committ
19200 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
19210 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67  n,.** or rolling
19220 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74   back a transact
19230 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72  ion (including r
19240 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
19250 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a  t-journal)..**.*
19260 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  * If the main da
19270 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
19280 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20  ot open, or the 
19290 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
192a0 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20  either.** DBMOD 
192b0 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
192c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
192d0 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
192e0 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a  se, the size .**
192f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
19300 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
19310 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
19320 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
19330 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68  ytes). .** If th
19340 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
19350 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
19360 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
19370 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
19380 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
19390 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
193a0 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
193b0 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d  * Or, it might m
193c0 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
193d0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
193e0 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
193f0 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
19400 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
19410 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
19420 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
19430 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
19440 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
19450 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
19460 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
19470 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
19480 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
19490 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
194a0 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
194b0 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
194c0 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
194d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
194e0 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
194f0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
19500 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
19510 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
19520 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
19530 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
19540 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19550 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
19560 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
19570 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
19580 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
19590 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
195a0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
195b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
195c0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
195d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
195e0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
195f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19600 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
19610 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69  READER );.  .  i
19620 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
19630 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50  ->fd) .   && (pP
19640 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
19650 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
19660 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
19670 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20  te==PAGER_OPEN) 
19680 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75  .  ){.    i64 cu
19690 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69  rrentSize, newSi
196a0 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61  ze;.    int szPa
196b0 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
196c0 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  eSize;.    asser
196d0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
196e0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
196f0 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   );.    /* TODO:
19700 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75   Is it safe to u
19710 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  se Pager.dbFileS
19720 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20  ize here? */.   
19730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
19740 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
19750 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
19760 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
19770 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61   szPage*(i64)nPa
19780 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
19790 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
197a0 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
197b0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
197c0 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
197d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
197e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
197f0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
19800 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
19810 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72   }else if( (curr
19820 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c  entSize+szPage)<
19830 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
19840 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d      char *pTmp =
19850 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
19860 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ce;.        mems
19870 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61  et(pTmp, 0, szPa
19880 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ge);.        tes
19890 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
198a0 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65  szPage) == curre
198b0 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
198c0 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
198d0 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20  Size-szPage) >  
198e0 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
198f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19900 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
19910 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50  r->fd, pTmp, szP
19920 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50  age, newSize-szP
19930 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
19940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19960 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
19970 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
19980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
19990 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
199a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61  *.** Return a sa
199b0 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  nitized version 
199c0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  of the sector-si
199d0 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46  ze of OS file pF
199e0 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75  ile. The.** retu
199f0 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72  rn value is guar
19a00 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65  anteed to lie be
19a10 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58  tween 32 and MAX
19a20 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
19a30 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74  .int sqlite3Sect
19a40 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
19a50 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
19a60 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65  nt iRet = sqlite
19a70 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46  3OsSectorSize(pF
19a80 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74  ile);.  if( iRet
19a90 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20  <32 ){.    iRet 
19aa0 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69  = 512;.  }else i
19ab0 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54  f( iRet>MAX_SECT
19ac0 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61  OR_SIZE ){.    a
19ad0 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f  ssert( MAX_SECTO
19ae0 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20  R_SIZE>=512 );. 
19af0 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45     iRet = MAX_SE
19b00 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20  CTOR_SIZE;.  }. 
19b10 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a   return iRet;.}.
19b20 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
19b30 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
19b40 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
19b50 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
19b60 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
19b70 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
19b80 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
19b90 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
19ba0 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
19bb0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
19bc0 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
19bd0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73   will be used us
19be0 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
19bf0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
19c00 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
19c10 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
19c20 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
19c30 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
19c40 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
19c50 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
19c60 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
19c70 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
19c80 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
19c90 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
19ca0 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
19cb0 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
19cc0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
19cd0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
19ce0 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
19cf0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
19d00 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
19d10 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
19d20 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66  nded up to 32 if
19d30 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
19d40 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64  han 32, or round
19d50 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53  ed down to MAX_S
19d60 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74  ECTOR_SIZE if it
19d70 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
19d80 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  han MAX_SECTOR_S
19d90 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  IZE..**.** If th
19da0 65 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53  e file has the S
19db0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
19dc0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
19dd0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73  property, then s
19de0 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74  et.** the effect
19df0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
19e00 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76  to its minimum v
19e10 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65  alue (512).  The
19e20 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70   purpose of.** p
19e30 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
19e40 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74  e is to define t
19e50 68 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73  he "blast radius
19e60 22 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a  " of bytes that.
19e70 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
19e80 69 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72  if a crash occur
19e90 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  s while writing 
19ea0 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  to a single byte
19eb0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67   in.** that rang
19ec0 65 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57  e.  But with POW
19ed0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
19ee0 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69  , the blast radi
19ef0 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74  us is zero.** (t
19f00 68 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45  hat is what POWE
19f10 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
19f20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69  means), so we mi
19f30 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f  nimize the secto
19f40 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20  r.** size.  For 
19f50 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
19f60 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72  ibility of the r
19f70 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
19f80 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20  file format,.** 
19f90 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65  we cannot reduce
19fa0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19fb0 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77  ector size below
19fc0 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   512..*/.static 
19fd0 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
19fe0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
19ff0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  ){.  assert( isO
1a000 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1a010 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1a020 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ile );..  if( pP
1a030 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20  ager->tempFile. 
1a040 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
1a050 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1a060 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1a070 20 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   & .            
1a080 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50    SQLITE_IOCAP_P
1a090 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a0a0 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  TE)!=0.  ){.    
1a0b0 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
1a0c0 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
1a0d0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1a0e0 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
1a0f0 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
1a100 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1a110 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
1a120 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
1a130 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
1a140 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
1a150 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  t. */.    pPager
1a160 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
1a170 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  12;.  }else{.   
1a180 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1a190 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63  ize = sqlite3Sec
1a1a0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
1a1b0 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fd);.  }.}../*.*
1a1c0 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
1a1d0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
1a1e0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1a1f0 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
1a200 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
1a210 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
1a220 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
1a230 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
1a240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1a250 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
1a260 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
1a270 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
1a280 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
1a290 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
1a2a0 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
1a2b0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1a2c0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1a2d0 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
1a2e0 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
1a2f0 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
1a300 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
1a310 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
1a320 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
1a330 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
1a340 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
1a350 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
1a360 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
1a370 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1a380 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1a390 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
1a3a0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
1a3b0 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
1a3c0 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
1a3d0 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
1a3e0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1a3f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1a400 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
1a410 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
1a420 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
1a430 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
1a440 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1a450 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1a460 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
1a470 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
1a480 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
1a490 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
1a4a0 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
1a4b0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1a4c0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a4d0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
1a4e0 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61  **  (7)  zero pa
1a4f0 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65  dding out to the
1a500 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a   next sector siz
1a510 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f  e..**  (8)  Zero
1a520 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
1a530 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
1a540 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
1a550 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
1a560 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
1a570 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
1a580 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
1a590 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
1a5a0 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
1a5b0 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
1a5c0 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
1a5d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
1a5e0 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
1a5f0 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65  st 7 items above
1a600 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
1a610 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
1a620 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1a630 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a   the 8th item..*
1a640 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
1a650 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
1a660 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
1a670 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
1a680 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
1a690 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
1a6a0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1a6b0 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
1a6c0 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
1a6d0 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
1a6e0 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
1a6f0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1a700 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
1a710 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
1a720 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
1a730 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
1a740 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
1a750 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
1a760 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
1a770 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1a780 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
1a790 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
1a7a0 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
1a7b0 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
1a7c0 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
1a7d0 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
1a7e0 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
1a7f0 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
1a800 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
1a810 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
1a820 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
1a830 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
1a840 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
1a850 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
1a860 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
1a870 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
1a880 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
1a890 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
1a8a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
1a8b0 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
1a8c0 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
1a8d0 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
1a8e0 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
1a8f0 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
1a900 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
1a910 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
1a920 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1a930 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
1a940 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
1a950 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
1a960 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
1a970 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
1a980 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
1a990 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
1a9a0 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
1a9b0 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
1a9c0 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
1a9d0 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
1a9e0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
1a9f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1aa00 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
1aa10 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
1aa20 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
1aa30 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
1aa40 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
1aa50 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
1aa60 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
1aa70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
1aa80 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
1aa90 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
1aaa0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
1aab0 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
1aac0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1aad0 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
1aae0 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
1aaf0 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
1ab00 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
1ab10 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
1ab20 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
1ab30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
1ab40 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
1ab50 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
1ab60 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1ab70 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
1ab80 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e  Hot parameter in
1ab90 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
1aba0 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f  are trying to ro
1abb0 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  llback a journal
1abc0 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62  .** that might b
1abd0 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e  e a hot journal.
1abe0 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62    Or, it could b
1abf0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
1ac00 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72  al is .** preser
1ac10 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a  ved because of J
1ac20 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
1ac30 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44  ST or JOURNALMOD
1ac40 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49  E_TRUNCATE..** I
1ac50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
1ac60 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73  ally is hot, res
1ac70 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63  et the pager cac
1ac80 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67  he prior rolling
1ac90 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e  .** back any con
1aca0 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f  tent.  If the jo
1acb0 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20  urnal is merely 
1acc0 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72  persistent, no r
1acd0 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65  eset is.** neede
1ace0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1acf0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1ad00 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1ad10 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
1ad20 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1ad30 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1ad40 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
1ad50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ad60 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1ad70 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1ad80 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ada0 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
1adb0 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1adc0 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ade0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1adf0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
1ae00 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
1ae10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1ae20 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
1ae30 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
1ae40 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1ae50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ae60 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
1ae70 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1ae80 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
1ae90 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1aea0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1aeb0 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
1aec0 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
1aed0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
1aee0 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
1aef0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
1af00 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50  y */.  int needP
1af10 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20  agerReset;      
1af20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
1af30 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66   page prior to f
1af40 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61  irst page rollba
1af50 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ck */..  /* Figu
1af60 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1af70 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
1af80 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
1af90 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
1afa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1afb0 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
1afc0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1afd0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72  ger->jfd) );.  r
1afe0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1aff0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1b000 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
1b010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b020 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1b030 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
1b040 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
1b050 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
1b060 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1b070 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
1b080 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
1b090 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b0a0 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
1b0b0 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
1b0c0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
1b0d0 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
1b0e0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
1b0f0 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
1b100 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1b110 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
1b120 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
1b130 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
1b140 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1b150 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
1b160 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
1b170 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
1b180 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
1b190 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
1b1a0 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
1b1b0 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
1b1c0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
1b1d0 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
1b1e0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1b1f0 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
1b200 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
1b210 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
1b220 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
1b230 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
1b240 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
1b250 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
1b260 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
1b270 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1b280 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
1b290 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1b2a0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1b2b0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1b2c0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1b2d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b2e0 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1b2f0 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
1b300 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
1b310 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
1b320 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1b330 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
1b340 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
1b350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b360 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
1b370 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1b380 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
1b390 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1b3a0 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
1b3b0 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
1b3c0 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
1b3d0 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
1b3e0 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
1b3f0 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
1b400 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1b410 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
1b420 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1b430 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
1b440 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
1b450 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
1b460 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
1b470 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
1b480 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
1b490 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
1b4a0 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
1b4b0 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
1b4c0 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
1b4d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1b4e0 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
1b4f0 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
1b500 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
1b510 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
1b520 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68  t have failed wh
1b530 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
1b540 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
1b550 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
1b560 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
1b570 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
1b580 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
1b590 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1b5a0 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
1b5b0 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
1b5c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b5d0 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
1b5e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1b5f0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
1b600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1b610 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1b620 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b630 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1b640 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
1b650 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
1b660 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
1b670 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
1b680 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
1b690 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
1b6a0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1b6b0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
1b6c0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
1b6d0 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
1b6e0 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
1b6f0 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
1b700 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
1b710 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1b720 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
1b730 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
1b740 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1b750 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
1b760 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
1b770 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1b780 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1b790 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1b7a0 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
1b7b0 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
1b7c0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1b7d0 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
1b7e0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1b7f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1b800 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
1b810 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
1b820 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
1b830 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
1b840 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
1b850 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1b860 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
1b870 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
1b880 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
1b890 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
1b8a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1b8b0 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
1b8c0 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
1b8d0 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
1b8e0 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
1b8f0 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
1b900 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
1b910 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
1b920 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
1b930 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1b940 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
1b950 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
1b960 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
1b970 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
1b980 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
1b990 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
1b9a0 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
1b9b0 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
1b9c0 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
1b9d0 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
1b9e0 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
1b9f0 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
1ba00 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1ba10 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
1ba20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
1ba30 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
1ba40 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
1ba50 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
1ba60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
1ba70 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1ba80 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1ba90 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
1baa0 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
1bab0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1bac0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
1bad0 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1bae0 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
1baf0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1bb00 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
1bb10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
1bb20 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1bb30 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
1bb40 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
1bb50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1bb60 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1bb70 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1bb80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
1bb90 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1bba0 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
1bbb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
1bbc0 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
1bbd0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1bbe0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1bbf0 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
1bc00 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
1bc10 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
1bc20 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1bc30 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
1bc40 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1bc50 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1bc60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1bc70 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1bc80 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1bc90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1bca0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1bcb0 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
1bcc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1bcd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1bce0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1bcf0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1bd00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1bd10 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
1bd20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
1bd30 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
1bd40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1bd50 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
1bd60 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1bd70 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
1bd80 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
1bd90 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
1bda0 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
1bdb0 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
1bdc0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
1bdd0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1bde0 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
1bdf0 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
1be00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1be10 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1be20 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1be30 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
1be40 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
1be50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1be60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1be70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1be80 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1be90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bea0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
1beb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bec0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1bed0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1bee0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1bef0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1bf00 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
1bf10 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
1bf20 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
1bf30 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
1bf40 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
1bf50 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
1bf60 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
1bf70 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
1bf80 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
1bf90 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
1bfa0 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
1bfb0 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
1bfc0 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
1bfd0 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
1bfe0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
1bff0 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
1c000 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
1c010 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
1c020 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
1c030 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
1c040 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
1c050 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
1c060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c070 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1c080 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c090 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c0a0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1c0b0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
1c0c0 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
1c0d0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1c0e0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1c0f0 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
1c100 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
1c110 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
1c120 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
1c130 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
1c140 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
1c150 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
1c160 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
1c170 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1c180 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
1c190 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1c1a0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
1c1b0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
1c1c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
1c1d0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c1e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c1f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1c200 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
1c210 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
1c220 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
1c230 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
1c240 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
1c250 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1c260 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
1c270 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
1c280 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
1c290 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
1c2a0 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
1c2b0 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
1c2c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1c2d0 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
1c2e0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
1c2f0 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
1c300 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
1c310 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1c320 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
1c330 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ied..  */.#ifdef
1c340 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c350 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
1c360 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1c370 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1c380 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
1c390 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
1c3a0 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
1c3b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1c3c0 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62  /* If this playb
1c3d0 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67  ack is happening
1c3e0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
1c3f0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  s a result of an
1c400 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c   IO or .  ** mal
1c410 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f  loc error that o
1c420 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68  ccurred after th
1c430 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1c440 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74   was updated but
1c450 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68   .  ** before th
1c460 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
1c470 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  s committed, the
1c480 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  n the change-cou
1c490 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  nter .  ** modif
1c4a0 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74  ication may just
1c4b0 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72   have been rever
1c4c0 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70  ted. If this hap
1c4d0 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76  pens in exclusiv
1c4e0 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68  e .  ** mode, th
1c4f0 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72  en subsequent tr
1c500 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f  ansactions perfo
1c510 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e  rmed by the conn
1c520 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a  ection will not.
1c530 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20    ** update the 
1c540 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1c550 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20  t all. This may 
1c560 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e  lead to cache in
1c570 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a  consistency.  **
1c580 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74   problems for ot
1c590 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74  her processes at
1c5a0 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1c5b0 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a  he future. So, j
1c5c0 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ust.  ** in case
1c5d0 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e   this has happen
1c5e0 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68  ed, clear the ch
1c5f0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
1c600 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  ag now..  */.  p
1c610 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1c620 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1c630 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1c640 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c650 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
1c660 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1c670 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
1c680 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1c690 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1c6a0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1c6b0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1c6c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c6d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1c6e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1c6f0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28  QLITE_OK.   && (
1c700 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1c710 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1c720 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1c730 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1c740 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
1c750 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
1c760 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1c770 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c780 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1c790 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1c7a0 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1c7b0 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29  ter[0]!='\0', 0)
1c7c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c7d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1c7e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1c7f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1c800 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1c810 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1c820 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1c830 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1c840 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1c850 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1c860 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1c870 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1c880 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1c890 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1c8a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1c8b0 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1c8c0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1c8d0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1c8e0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
1c8f0 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
1c900 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1c910 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
1c920 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
1c930 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
1c940 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
1c950 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
1c960 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
1c970 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
1c980 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
1c990 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
1c9a0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
1c9b0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
1c9c0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1c9d0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1c9e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1c9f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1ca00 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1ca10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ca20 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
1ca30 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
1ca40 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
1ca50 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
1ca60 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1ca70 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
1ca80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1ca90 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
1caa0 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
1cab0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1cac0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
1cad0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
1cae0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1caf0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
1cb00 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1cb10 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1cb20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1cb30 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
1cb40 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1cb50 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
1cb60 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
1cb70 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1cb80 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1cb90 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75  ge(PgHdr *pPg, u
1cba0 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61  32 iFrame){.  Pa
1cbb0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1cbc0 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1cbd0 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1cbe0 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1cbf0 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
1cc00 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
1cc10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1cc20 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
1cc30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cc40 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1cc50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1cc60 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
1cc70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1cc80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1cc90 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
1cca0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ccb0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
1ccc0 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
1ccd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1cce0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1ccf0 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1cd00 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
1cd10 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65  fd)) ){.    asse
1cd20 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
1cd30 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73  File );.    mems
1cd40 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
1cd50 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1cd60 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ze);.    return 
1cd70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1cd80 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a    if( iFrame ){.
1cd90 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
1cda0 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
1cdb0 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
1cdc0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
1cdd0 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1cde0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1cdf0 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a  al, iFrame, pgsz
1ce00 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1ce10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
1ce20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
1ce30 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1ce40 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
1ce50 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1ce60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
1ce70 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69  ->pData, pgsz, i
1ce80 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
1ce90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1cea0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1ceb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cec0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1ced0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1cee0 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
1cef0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1cf00 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
1cf10 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
1cf20 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
1cf30 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
1cf40 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
1cf50 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
1cf60 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
1cf70 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
1cf80 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
1cf90 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
1cfa0 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
1cfb0 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
1cfc0 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
1cfd0 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
1cfe0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1cff0 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
1d000 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
1d010 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
1d020 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
1d030 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1d040 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
1d050 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
1d060 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
1d070 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
1d080 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
1d090 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
1d0a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1d0b0 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
1d0c0 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
1d0d0 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
1d0e0 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
1d0f0 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
1d100 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1d110 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
1d120 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
1d130 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
1d140 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69    ** white noisi
1d150 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  ng equaling 16 b
1d160 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1d170 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1d180 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1d190 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1d1a0 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1d1b0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1d1c0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1d1d0 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1d1e0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1d1f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d200 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1d210 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1d220 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1d230 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1d240 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1d250 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1d260 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d270 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1d280 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1d290 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1d2a0 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1d2b0 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
1d2c0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1d2d0 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1d2e0 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1d2f0 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1d300 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1d310 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1d320 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1d330 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1d340 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1d350 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1d360 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1d370 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1d380 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1d390 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1d3a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d3b0 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75   Update the valu
1d3c0 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d  e of the change-
1d3d0 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65  counter at offse
1d3e0 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a  ts 24 and 92 in.
1d3f0 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  ** the header an
1d400 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72  d the sqlite ver
1d410 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
1d420 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
1d430 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e  This is an uncon
1d440 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e  ditional update.
1d450 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70    See also the p
1d460 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1d470 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75  counter().** rou
1d480 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20  tine which only 
1d490 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1d4a0 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68  ge-counter if th
1d4b0 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75  e update is actu
1d4c0 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20  ally.** needed, 
1d4d0 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
1d4e0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
1d4f0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61  ngeCountDone sta
1d500 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  te variable..*/.
1d510 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1d520 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1d530 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67  unter(PgHdr *pPg
1d540 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  ){.  u32 change_
1d550 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49  counter;..  /* I
1d560 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1d570 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1d580 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1d590 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1d5a0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1d5b0 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1d5c0 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65  ((u8*)pPg->pPage
1d5d0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31  r->dbFileVers)+1
1d5e0 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1d5f0 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1d600 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1d610 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  nter);..  /* Als
1d620 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
1d630 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1d640 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
1d650 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79  9 and in.  ** by
1d660 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
1d670 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1d680 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
1d690 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1d6a0 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20  .  ** is valid. 
1d6b0 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  */.  put32bits((
1d6c0 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1d6d0 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
1d6e0 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62  unter);.  put32b
1d6f0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1d700 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
1d710 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1d720 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  R);.}..#ifndef S
1d730 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1d740 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d750 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
1d760 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
1d770 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1d780 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
1d790 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
1d7a0 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
1d7b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1d7c0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
1d7d0 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
1d7e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1d7f0 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
1d800 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
1d810 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
1d820 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1d830 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1d840 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1d850 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
1d860 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
1d870 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1d880 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
1d890 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
1d8a0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1d8b0 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
1d8c0 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
1d8d0 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
1d8e0 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
1d8f0 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
1d900 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d910 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
1d920 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
1d930 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1d940 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
1d950 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
1d960 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
1d970 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1d980 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1d990 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1d9a0 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
1d9b0 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
1d9c0 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
1d9d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d9e0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1d9f0 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1da00 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
1da10 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71 6c 69  g;..  pPg = sqli
1da20 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
1da30 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69  Pager, iPg);.  i
1da40 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66  f( pPg ){.    if
1da50 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
1da60 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29  ageRefcount(pPg)
1da70 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
1da80 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
1da90 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
1daa0 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d 65        u32 iFrame
1dab0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1dac0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1dad0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  er) ){.        r
1dae0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
1daf0 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
1db00 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pWal, pPg->pgno,
1db10 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20   &iFrame);.     
1db20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1db30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1db40 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
1db50 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
1db60 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1db70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1db80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1db90 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
1dba0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
1dbb0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1dbc0 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1dbd0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1dbe0 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1dbf0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1dc00 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1dc10 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1dc20 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1dc30 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1dc40 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1dc50 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1dc60 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1dc70 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1dc80 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1dc90 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1dca0 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1dcb0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1dcc0 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1dcd0 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1dce0 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1dcf0 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1dd00 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1dd10 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1dd20 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1dd30 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1dd40 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1dd50 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1dd60 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1dd70 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1dd80 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1dd90 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1dda0 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1ddb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1ddc0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1ddd0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1dde0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ddf0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1de00 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1de10 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1de20 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1de30 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1de40 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1de50 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1de60 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1de90 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1dea0 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dec0 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1ded0 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1dee0 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1def0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1df00 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1df10 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1df20 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1df30 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1df40 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1df50 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1df60 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1df70 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1df80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1df90 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1dfa0 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1dfb0 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1dfc0 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1dfd0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1dfe0 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1dff0 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1e000 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1e010 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1e020 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1e030 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1e040 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1e050 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1e060 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1e070 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1e080 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1e090 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1e0a0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
1e0b0 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
1e0c0 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  OK ){.    PgHdr 
1e0d0 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
1e0e0 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d  pDirty;.    rc =
1e0f0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1e100 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65  ck((void *)pPage
1e110 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  r, pList->pgno);
1e120 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
1e130 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  xt;.  }..  retur
1e140 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1e150 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e160 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
1e170 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1e180 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  s(). As well as 
1e190 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63  logging.** the c
1e1a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
1e1b0 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61  ist of pages hea
1e1c0 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f  ded by pList (co
1e1d0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
1e1e0 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  y),.** this func
1e1f0 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e  tion notifies an
1e200 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20  y active backup 
1e210 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74  processes that t
1e220 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  he pages have.**
1e230 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a   changed. .**.**
1e240 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   The list of pag
1e250 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  es passed into t
1e260 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1e270 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20  lways sorted by 
1e280 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1e290 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31  Hence, if page 1
1e2a0 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72   appears anywher
1e2b0 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69  e on the list, i
1e2c0 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69  t will be the fi
1e2d0 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74  rst page..*/ .st
1e2e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61  atic int pagerWa
1e2f0 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72  lFrames(.  Pager
1e300 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1e310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1e320 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1e330 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20  PgHdr *pList,   
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e350 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65  /* List of frame
1e360 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67  s to log */.  Pg
1e370 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20  no nTruncate,   
1e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e390 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   Database size a
1e3a0 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74  fter this commit
1e3b0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1e3c0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1e3d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e3e0 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1e3f0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1e400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e420 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e430 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20  t nList;        
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e450 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e460 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 23 69 66   in pList */.#if
1e470 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1e480 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1e490 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  d(SQLITE_CHECK_P
1e4a0 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a 70  AGES).  PgHdr *p
1e4b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e4c0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1e4d0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1e4e0 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  s */.#endif..  a
1e4f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1e500 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Wal );.  assert(
1e510 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66   pList );.#ifdef
1e520 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1e530 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1e540 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20  he page list is 
1e550 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
1e560 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c  er */.  for(p=pL
1e570 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69  ist; p && p->pDi
1e580 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  rty; p=p->pDirty
1e590 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1e5a0 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72  ->pgno < p->pDir
1e5b0 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a  ty->pgno );.  }.
1e5c0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1e5d0 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  ( pList->pDirty=
1e5e0 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29  =0 || isCommit )
1e5f0 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ;.  if( isCommit
1e600 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1e610 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1e620 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1e630 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1e640 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1e650 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1e660 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1e670 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1e680 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1e690 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1e6a0 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1e6b0 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1e6c0 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1e6d0 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1e6e0 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1e6f0 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1e700 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1e710 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74    PgHdr **ppNext
1e720 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e   = &pList;.    n
1e730 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  List = 0;.    fo
1e740 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e  r(p=pList; (*ppN
1e750 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70  ext = p)!=0; p=p
1e760 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1e770 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54   if( p->pgno<=nT
1e780 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1e790 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e     ppNext = &p->
1e7a0 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20  pDirty;.        
1e7b0 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  nList++;.      }
1e7c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1e7d0 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65  t( pList );.  }e
1e7e0 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  lse{.    nList =
1e7f0 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   1;.  }.  pPager
1e800 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
1e810 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69  AT_WRITE] += nLi
1e820 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  st;..  if( pList
1e830 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1e840 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1e850 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1e860 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1e870 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1e880 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1e890 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1e8a0 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1e8b0 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d  sCommit, pPager-
1e8c0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20  >walSyncFlags.  
1e8d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1e8e0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1e8f0 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
1e900 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
1e910 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1e920 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1e930 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
1e940 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
1e950 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c  Backup, p->pgno,
1e960 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29   (u8 *)p->pData)
1e970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
1e980 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1e990 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d  _PAGES.  pList =
1e9a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
1e9b0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
1e9c0 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28  pPCache);.  for(
1e9d0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1e9e0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61  >pDirty){.    pa
1e9f0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
1ea00 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (p);.  }.#endif.
1ea10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ea20 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72  ./*.** Begin a r
1ea30 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
1ea40 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a  on the WAL..**.*
1ea50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
1ea60 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  sed to be called
1ea70 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73   "pagerOpenSnaps
1ea80 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69  hot()" because i
1ea90 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a  t essentially.**
1eaa0 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f   makes a snapsho
1eab0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1eac0 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  e at the current
1ead0 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61   point in time a
1eae0 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20  nd preserves.** 
1eaf0 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f  that snapshot fo
1eb00 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61  r use by the rea
1eb10 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20  der in spite of 
1eb20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61  concurrently cha
1eb30 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72  nges by.** other
1eb40 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63   writers or chec
1eb50 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74  kpointers..*/.st
1eb60 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65  atic int pagerBe
1eb70 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1eb80 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
1eb90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1ebc0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61  ode */.  int cha
1ebd0 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  nged = 0;       
1ebe0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1ebf0 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62   if cache must b
1ec00 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73  e reset */..  as
1ec10 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1ec20 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
1ec30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1ec40 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1ec50 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
1ec60 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
1ec70 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  R );..  /* sqlit
1ec80 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1ec90 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
1eca0 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
1ecb0 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
1ecc0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
1ecd0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
1ece0 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
1ecf0 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
1ed00 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
1ed10 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
1ed20 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
1ed30 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
1ed40 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
1ed50 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
1ed60 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
1ed70 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1ed80 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1ed90 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
1eda0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
1edb0 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1edc0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
1edd0 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
1ede0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1edf0 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  | changed ){.   
1ee00 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1ee10 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
1ee20 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20  ager->bUseFetch 
1ee30 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
1ee40 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
1ee50 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
1ee60 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1ee70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ee80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1ee90 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
1eea0 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
1eeb0 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
1eec0 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
1eed0 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
1eee0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1eef0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1ef00 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
1ef10 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
1ef20 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
1ef30 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
1ef40 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
1ef50 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1ef60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1ef70 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1ef80 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1ef90 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
1efa0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
1efb0 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
1efc0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
1efd0 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
1efe0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
1eff0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1f000 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
1f010 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
1f020 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
1f030 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1f040 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
1f050 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1f060 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1f070 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1f080 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
1f090 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
1f0a0 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
1f0b0 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
1f0c0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
1f0d0 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
1f0e0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
1f0f0 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
1f100 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
1f110 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
1f120 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
1f130 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f140 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
1f150 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
1f160 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
1f170 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
1f180 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1f190 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
1f1a0 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
1f1b0 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
1f1c0 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
1f1d0 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
1f1e0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1f1f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f200 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1f210 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f220 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1f230 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  OCK );.  nPage =
1f240 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
1f250 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
1f260 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
1f270 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
1f280 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72  not available fr
1f290 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1f2a0 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65  ystem,.  ** dete
1f2b0 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f  rmine it based o
1f2c0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1f2d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1f2e0 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a   If the size.  *
1f2f0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
1f300 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
1f310 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
1f320 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  e of the page-si
1f330 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64  ze,.  ** round d
1f340 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65  own to the neare
1f350 73 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c  st page. Except,
1f360 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72   any file larger
1f370 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74   than 0.  ** byt
1f380 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
1f390 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74  nsidered to cont
1f3a0 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
1f3b0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1f3c0 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
1f3d0 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69  /* Size of db fi
1f400 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1f410 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
1f420 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1f430 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1f440 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
1f450 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1f460 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
1f470 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1f480 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1f490 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  &n);.      if( r
1f4a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f4b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f4c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1f4d0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67  .    nPage = (Pg
1f4e0 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70  no)((n+pPager->p
1f4f0 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61  ageSize-1) / pPa
1f500 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1f510 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1f520 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
1f530 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1f540 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
1f550 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f  than the.  ** co
1f560 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d  nfigured maximum
1f570 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69   pager number, i
1f580 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
1f590 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a  wed limit so.  *
1f5a0 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  * that the file 
1f5b0 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a  can be read..  *
1f5c0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50  /.  if( nPage>pP
1f5d0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
1f5e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
1f5f0 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65  no = (Pgno)nPage
1f600 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65  ;.  }..  *pnPage
1f610 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
1f620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f640 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43  OMIT_WAL./*.** C
1f650 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61  heck if the *-wa
1f660 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72  l file that corr
1f670 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64  esponds to the d
1f680 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1f690 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73  y pPager.** exis
1f6a0 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ts if the databa
1f6b0 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20  se is not empy, 
1f6c0 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74  or verify that t
1f6d0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
1f6e0 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20  es.** not exist 
1f6f0 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29  (by deleting it)
1f700 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1f710 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a   file is empty..
1f720 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
1f730 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
1f740 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c  ty and the *-wal
1f750 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70   file exists, op
1f760 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  en the pager.** 
1f770 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66  in WAL mode.  If
1f780 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f790 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20   empty or if no 
1f7a0 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1f7b0 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65  s and.** if no e
1f7c0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b  rror occurs, mak
1f7d0 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75  e sure Pager.jou
1f7e0 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20  rnalMode is not 
1f7f0 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  set to.** PAGER_
1f800 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e  JOURNALMODE_WAL.
1f810 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1f820 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72  LITE_OK or an er
1f830 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1f840 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1f850 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f  hold a SHARED lo
1f860 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1f870 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20  se file to call 
1f880 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1f890 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43  . Because an EXC
1f8a0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1f8b0 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65  he db file is re
1f8c0 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65  quired to delete
1f8d0 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20   .** a WAL on a 
1f8e0 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62  none-empty datab
1f8f0 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  ase, this ensure
1f900 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61  s there is no ra
1f910 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a  ce condition .**
1f920 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63   between the xAc
1f930 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64  cess() below and
1f940 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65   an xDelete() be
1f950 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20  ing executed by 
1f960 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63  some .** other c
1f970 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
1f980 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
1f990 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50  enWalIfPresent(P
1f9a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f9b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f9c0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
1f9d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1f9e0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
1f9f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1fa00 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
1fa10 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  K );..  if( !pPa
1fa20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
1fa30 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20  .    int isWal; 
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41     /* True if WA
1fa60 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  L file exists */
1fa70 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  .    Pgno nPage;
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1faa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fab0 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  */..    rc = pag
1fac0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1fad0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1fae0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1faf0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61   rc;.    if( nPa
1fb00 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ge==0 ){.      r
1fb10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1fb20 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
1fb30 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1fb40 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1fb50 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  ==SQLITE_IOERR_D
1fb60 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63  ELETE_NOENT ) rc
1fb70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1fb80 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20      isWal = 0;. 
1fb90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fba0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1fbb0 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
1fbc0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
1fbd0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49  ager->zWal, SQLI
1fbe0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1fbf0 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29  , &isWal.      )
1fc00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fc10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fc20 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c  .      if( isWal
1fc30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1fc40 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61  case( sqlite3Pca
1fc50 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
1fc60 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
1fc70 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1fc80 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1fc90 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b  nWal(pPager, 0);
1fca0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1fcb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fcc0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
1fcd0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20  NALMODE_WAL ){. 
1fce0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1fcf0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
1fd00 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
1fd10 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  ELETE;.      }. 
1fd20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1fd30 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
1fd40 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73  /*.** Playback s
1fd50 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f  avepoint pSavepo
1fd60 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76  int. Or, if pSav
1fd70 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68  epoint==NULL, th
1fd80 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74  en playback.** t
1fd90 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
1fda0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
1fdb0 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69  he case pSavepoi
1fdc0 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20  nt==NULL occurs 
1fdd0 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42  when .** a ROLLB
1fde0 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
1fdf0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53  s invoked on a S
1fe00 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73  AVEPOINT that is
1fe10 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
1fe20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ** savepoint..**
1fe30 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f  .** When pSavepo
1fe40 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  int is not NULL 
1fe50 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74  (meaning a non-t
1fe60 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
1fe70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e  oint is .** bein
1fe80 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20  g rolled back), 
1fe90 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
1fea0 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70  k consists of up
1feb0 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73   to three stages
1fec0 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69  ,.** performed i
1fed0 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63  n the order spec
1fee0 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ified:.**.**   *
1fef0 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   Pages are playe
1ff00 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
1ff10 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
1ff20 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a  rting at byte.**
1ff30 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65       offset Page
1ff40 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
1ff50 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
1ff60 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67  g to .**     Pag
1ff70 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1ff80 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68  Offset, or to th
1ff90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
1ffa0 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
1ffb0 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61   file if PagerSa
1ffc0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
1ffd0 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  et is zero..**.*
1ffe0 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61  *   * If PagerSa
1fff0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
20000 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  et is not zero, 
20010 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70  then pages are p
20020 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63  layed.**     bac
20030 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  k starting from 
20040 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
20050 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
20060 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20  ollowing .**    
20070 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20080 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68  iHdrOffset to th
20090 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
200a0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  n journal file..
200b0 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
200c0 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20  are then played 
200d0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75  back from the su
200e0 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
200f0 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20  starting.**     
20100 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61  with the PagerSa
20110 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20  vepoint.iSubRec 
20120 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
20130 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  o the end of.** 
20140 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
20150 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f  file..**.** Thro
20160 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62  ughout the rollb
20170 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63  ack process, eac
20180 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  h time a page is
20190 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
201a0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
201b0 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
201c0 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74   a bitvec struct
201d0 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44  ure (variable pD
201e0 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d  one in the.** im
201f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  plementation bel
20200 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65  ow). This is use
20210 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
20220 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a   a page is only.
20230 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ** rolled back t
20240 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
20250 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
20260 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61  in either journa
20270 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76  l..**.** If pSav
20280 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  epoint is NULL, 
20290 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f  then pages are o
202a0 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  nly played back 
202b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  from the main.**
202c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
202d0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
202e0 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20  for a bitvec in 
202f0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
20300 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
20310 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b   before playback
20320 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50   commences the P
20330 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69  ager.dbSize vari
20340 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74  able.** is reset
20350 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
20360 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68  at it held at th
20370 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
20380 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72  avepoint .** (or
20390 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e   transaction). N
203a0 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61  o page with a pa
203b0 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge-number greate
203c0 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
203d0 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62  e.** is played b
203e0 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65  ack. If one is e
203f0 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
20400 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e   simply skipped.
20410 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
20420 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
20430 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
20440 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
20450 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
20460 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20480 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  Effective size o
20490 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
204a0 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
204b0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
204c0 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74   /* End of first
204d0 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e   segment of main
204e0 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73  -journal records
204f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
20500 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
20510 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
20520 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
20530 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42   = 0;       /* B
20540 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20  itvec to ensure 
20550 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63  pages played bac
20560 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a  k only once */..
20570 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20580 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
20590 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
205a0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
205b0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
205c0 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  LOCKED );..  /* 
205d0 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65  Allocate a bitve
205e0 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72  c to use to stor
205f0 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67  e the set of pag
20600 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a  es rolled back *
20610 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
20620 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20  nt ){.    pDone 
20630 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
20640 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74  reate(pSavepoint
20650 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66  ->nOrig);.    if
20660 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ( !pDone ){.    
20670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20680 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
20690 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
206a0 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
206b0 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
206c0 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
206d0 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
206e0 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
206f0 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
20700 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
20710 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
20720 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
20730 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
20740 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  rigSize;.  pPage
20750 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
20760 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
20770 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70  pFile;..  if( !p
20780 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
20790 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
207a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
207b0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
207c0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
207d0 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
207e0 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
207f0 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
20800 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
20810 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
20820 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
20830 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
20840 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
20850 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
20860 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
20870 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
20880 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
20890 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
208a0 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
208b0 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
208c0 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
208d0 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
208e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
208f0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
20900 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
20910 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
20920 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
20930 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
20940 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
20950 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
20960 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
20970 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
20980 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
20990 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
209a0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
209b0 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
209c0 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
209d0 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
209e0 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
209f0 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
20a00 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
20a10 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
20a20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
20a30 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
20a40 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
20a50 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
20a60 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
20a70 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
20a80 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
20a90 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
20aa0 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
20ab0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20ac0 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
20ad0 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
20ae0 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
20af0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
20b00 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
20b10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20b20 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
20b30 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
20b40 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
20b50 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
20b60 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
20b70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
20b80 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
20b90 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
20ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20bb0 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
20bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20bd0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
20be0 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
20bf0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
20c00 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
20c10 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
20c20 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
20c30 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
20c40 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
20c50 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
20c60 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
20c70 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
20c80 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
20c90 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
20ca0 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
20cb0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
20cc0 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
20cd0 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
20ce0 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
20cf0 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
20d00 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
20d10 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
20d20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
20d30 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
20d40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
20d50 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
20d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20d70 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
20d80 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
20d90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20da0 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
20db0 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
20dc0 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
20dd0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
20de0 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
20df0 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
20e00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
20e10 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
20e20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
20e30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
20e40 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
20e50 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
20e60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
20e70 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
20e80 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
20e90 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
20ea0 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
20eb0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
20ec0 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
20ed0 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
20ee0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
20ef0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
20f00 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
20f10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
20f20 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
20f30 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
20f40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
20f50 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
20f60 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
20f70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20f80 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
20f90 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
20fa0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
20fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20fc0 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
20fd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
20fe0 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
20ff0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21000 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21010 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21020 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21030 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21040 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21050 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21060 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
21070 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
21080 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21090 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  >=szJ );..  /* F
210a0 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
210b0 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
210c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
210d0 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
210e0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
210f0 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
21100 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21110 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
21120 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
21130 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
21140 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
21150 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
21160 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
21170 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
21180 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
21190 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
211a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
211b0 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
211c0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
211d0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
211e0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
211f0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
21200 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
21210 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
21220 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
21230 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
21240 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
21250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
21260 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
21270 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
21280 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
21290 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
212a0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
212b0 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69  ( offset==(i64)i
212c0 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
212d0 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
212e0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
212f0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21300 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
21310 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
21320 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
21330 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
21340 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
21350 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
21360 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
21370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21380 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21390 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
213a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
213b0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
213c0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
213d0 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
213e0 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
213f0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
21400 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
21410 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
21420 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
21430 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
21440 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
21450 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
21460 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
21470 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43  Invoke SQLITE_FC
21480 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 20 62  NTL_MMAP_LIMIT b
21490 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ased on the curr
214a0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 6d 78 4d  ent value of mxM
214b0 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  map..*/.static v
214c0 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c  oid pagerFixMapl
214d0 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
214e0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  er){.  sqlite3_f
214f0 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72  ile *fd = pPager
21500 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70  ->fd;.  if( isOp
21510 65 6e 28 66 64 29 20 29 7b 0a 20 20 20 20 70 50  en(fd) ){.    pP
21520 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20  ager->bUseFetch 
21530 3d 20 28 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  = (fd->pMethods-
21540 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 29 20 26 26  >iVersion>=3) &&
21550 20 70 50 61 67 65 72 2d 3e 6d 78 4d 6d 61 70 3e   pPager->mxMmap>
21560 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
21570 72 2d 3e 62 55 73 65 46 65 74 63 68 20 29 7b 0a  r->bUseFetch ){.
21580 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
21590 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
215a0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
215b0 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d  E_FCNTL_MMAP_LIM
215c0 49 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IT,.            
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215e0 20 20 20 28 76 6f 69 64 2a 29 26 70 50 61 67 65     (void*)&pPage
215f0 72 2d 3e 6d 78 4d 6d 61 70 29 3b 0a 20 20 20 20  r->mxMmap);.    
21600 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
21610 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
21620 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65  m size of any me
21630 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64  mory mapping mad
21640 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21650 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
21660 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
21670 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  mapLimit(Pager *
21680 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f  pPager, sqlite3_
21690 69 6e 74 36 34 20 6d 78 4d 6d 61 70 29 7b 0a 20  int64 mxMmap){. 
216a0 20 70 50 61 67 65 72 2d 3e 6d 78 4d 6d 61 70 20   pPager->mxMmap 
216b0 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 70 61 67 65  = mxMmap;.  page
216c0 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
216d0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ger);.}../*.** F
216e0 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
216f0 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
21700 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  rom the pager..*
21710 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
21720 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20  gerShrink(Pager 
21730 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
21740 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28  te3PcacheShrink(
21750 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
21760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
21770 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
21780 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21790 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
217a0 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
217b0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
217c0 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
217d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
217e0 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
217f0 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
21800 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
21810 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
21820 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
21830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21840 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
21850 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
21860 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
21880 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
21890 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
218a0 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
218b0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
218c0 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
218d0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
218e0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
218f0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
21900 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
21910 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
21920 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
21940 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
21950 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
21960 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
21970 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
21980 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
21990 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
219a0 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
219b0 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
219c0 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
219d0 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
219e0 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
219f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
21a00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
21a10 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
21a20 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
21a30 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
21a40 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
21a50 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
21a60 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
21a70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21a80 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
21a90 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
21aa0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
21ab0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
21ad0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
21ae0 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
21af0 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
21b00 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
21b10 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
21b20 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
21b30 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
21b40 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
21b50 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
21b60 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
21b70 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
21b80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21b90 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
21ba0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
21bb0 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
21bc0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
21bd0 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
21be0 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
21bf0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
21c00 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
21c10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
21c20 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
21c30 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
21c40 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
21c50 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
21c60 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
21c70 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
21c80 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
21c90 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
21ca0 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
21cb0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
21cc0 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
21cd0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
21ce0 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
21cf0 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
21d00 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
21d10 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
21d20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
21d30 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
21d40 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
21d50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
21d60 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
21d70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
21d80 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
21d90 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
21da0 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
21db0 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
21dc0 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
21dd0 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
21de0 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
21df0 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
21e00 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
21e10 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
21e20 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
21e30 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
21e40 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
21e50 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
21e60 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
21e70 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
21e80 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
21e90 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
21ea0 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
21eb0 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
21ec0 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
21ed0 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
21ee0 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
21ef0 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
21f00 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
21f10 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
21f20 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
21f30 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
21f40 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
21f50 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
21f60 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
21f70 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
21f80 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
21f90 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
21fa0 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
21fb0 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
21fc0 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
21fd0 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
21fe0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
21ff0 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
22000 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
22010 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
22020 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
22030 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
22040 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
22050 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
22060 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
22070 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
22080 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
22090 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
220a0 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67  fetyLevel(.  Pag
220b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
220c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
220d0 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
220e0 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  vel for */.  int
220f0 20 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20   level,         
22100 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e     /* PRAGMA syn
22110 63 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46  chronous.  1=OFF
22120 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55  , 2=NORMAL, 3=FU
22130 4c 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46  LL */  .  int bF
22140 75 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20  ullFsync,       
22150 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73  /* PRAGMA fullfs
22160 79 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b  ync */.  int bCk
22170 70 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f  ptFullFsync    /
22180 2a 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f  * PRAGMA checkpo
22190 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f  int_fullfsync */
221a0 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65  .){.  assert( le
221b0 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c  vel>=1 && level<
221c0 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =3 );.  pPager->
221d0 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
221e0 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
221f0 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
22200 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
22210 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
22220 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
22230 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20  le) ?1:0;.  if( 
22240 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
22250 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
22260 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ncFlags = 0;.   
22270 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22280 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65  cFlags = 0;.  }e
22290 6c 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79  lse if( bFullFsy
222a0 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
222b0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
222c0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
222d0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
222e0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
222f0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
22300 7d 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46  }else if( bCkptF
22310 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20  ullFsync ){.    
22320 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22330 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22340 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
22350 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
22360 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22370 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  FULL;.  }else{. 
22380 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22390 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
223a0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
223b0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
223c0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
223d0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  NC_NORMAL;.  }. 
223e0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
223f0 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e  Flags = pPager->
22400 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28  syncFlags;.  if(
22410 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
22420 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22430 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d  >walSyncFlags |=
22440 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41   WAL_SYNC_TRANSA
22450 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65  CTIONS;.  }.}.#e
22460 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
22470 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
22480 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
22490 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
224a0 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
224b0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
224c0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
224d0 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
224e0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
224f0 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
22500 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
22510 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
22520 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
22530 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
22540 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
22550 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
22560 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
22570 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
22580 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
22590 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
225a0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
225b0 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
225c0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
225d0 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
225e0 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
225f0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
22600 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
22610 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
22620 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
22630 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
22640 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
22650 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
22660 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
22670 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
22680 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
22690 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
226a0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
226b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
226c0 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
226d0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
226e0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
226f0 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
22700 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
22710 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
22720 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
22730 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
22740 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
22750 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
22760 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
22770 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
22780 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
22790 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
227a0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
227b0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
227c0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
227d0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
227e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22800 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
22810 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22820 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
22830 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
22840 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
22850 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
22860 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
22870 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
22880 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
22890 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
228a0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
228b0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
228c0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
228d0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
228e0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
228f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
22900 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
22910 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
22920 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
22930 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
22940 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
22950 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
22960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
22970 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
22980 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
22990 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
229a0 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
229b0 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
229c0 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
229d0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
229e0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
229f0 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
22a00 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
22a10 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
22a20 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
22a30 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
22a40 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
22a50 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
22a60 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
22a70 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
22a80 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
22a90 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
22aa0 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
22ab0 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
22ac0 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
22ad0 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
22ae0 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
22af0 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
22b00 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
22b10 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
22b20 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
22b40 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
22b50 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
22b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b90 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
22ba0 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
22bb0 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
22bc0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
22bd0 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
22be0 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
22bf0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
22c00 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
22c10 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
22c20 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
22c30 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
22c40 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
22c50 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
22c60 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
22c70 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
22c80 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
22c90 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
22ca0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
22cb0 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
22cc0 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
22cd0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
22ce0 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
22cf0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
22d00 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
22d10 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20  tBusyhandler(.  
22d20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d40 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
22d50 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
22d60 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
22d70 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
22d80 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
22d90 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
22da0 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
22db0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22dd0 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
22de0 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
22df0 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d   */.){.  pPager-
22e00 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
22e10 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
22e20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
22e30 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
22e40 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66  andlerArg;..  if
22e50 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
22e60 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  >fd) ){.    void
22e70 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a   **ap = (void **
22e80 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  )&pPager->xBusyH
22e90 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65  andler;.    asse
22ea0 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  rt( ((int(*)(voi
22eb0 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78  d *))(ap[0]))==x
22ec0 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20  BusyHandler );. 
22ed0 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d     assert( ap[1]
22ee0 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ==pBusyHandlerAr
22ef0 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g );.    sqlite3
22f00 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
22f10 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
22f20 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48  LITE_FCNTL_BUSYH
22f30 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29  ANDLER, (void *)
22f40 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
22f50 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
22f60 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
22f70 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
22f80 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
22f90 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
22fa0 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
22fb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
22fc0 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
22fd0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
22fe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
22ff0 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
23000 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
23010 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
23020 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
23030 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
23040 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
23050 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49  E_IOERR, an SQLI
23060 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62  TE_IOERR_xxx sub
23070 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f  -code or SQLITE_
23080 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  FULL)..**.** Oth
23090 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f  erwise, if all o
230a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
230b0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
230c0 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65    * the new page
230d0 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20   size (value of 
230e0 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76  *pPageSize) is v
230f0 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a  alid (a power .*
23100 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74  *     of two bet
23110 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c  ween 512 and SQL
23120 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
23130 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61  E, inclusive), a
23140 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
23150 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
23160 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
23170 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ences, and.**.**
23180 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
23190 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20  e is either not 
231a0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
231b0 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a  abase or it is.*
231c0 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f  *     an in-memo
231d0 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
231e0 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69   currently consi
231f0 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65  sts of zero page
23200 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  s..**.** then th
23210 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e pager object p
23220 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
23230 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  to *pPageSize..*
23240 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
23250 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64   size is changed
23260 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
23270 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65  tion uses sqlite
23280 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a  3PagerMalloc() .
23290 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e  ** to obtain a n
232a0 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  ew Pager.pTmpSpa
232b0 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  ce buffer. If th
232c0 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  is allocation at
232d0 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c  tempt .** fails,
232e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
232f0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
23300 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61  e page size rema
23310 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a  ins unchanged. .
23320 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ** In all other 
23330 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  cases, SQLITE_OK
23340 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
23350 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
23360 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  size is not chan
23370 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61  ged, either beca
23380 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  use one of the e
23390 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e  numerated.** con
233a0 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73  ditions above is
233b0 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70   not true, the p
233c0 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f  ager was in erro
233d0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
233e0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61  s.** function wa
233f0 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63  s called, or bec
23400 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ause the memory 
23410 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
23420 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74  pt failed, .** t
23430 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69  hen *pPageSize i
23440 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64  s set to the old
23450 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20  , retained page 
23460 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75  size before retu
23470 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
23480 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
23490 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
234a0 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53  ger, u32 *pPageS
234b0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
234c0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
234d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
234e0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
234f0 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20  le to do a full 
23500 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
23510 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68  te() here, as th
23520 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
23530 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
23540 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72  rom within Pager
23550 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74  Open(), before t
23560 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66  he state.  ** of
23570 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
23580 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  t is internally 
23590 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a  consistent..  **
235a0 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  ** At one poi
235b0 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nt this function
235c0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
235d0 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
235e0 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47  was in .  ** PAG
235f0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
23600 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f  But since PAGER_
23610 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72  ERROR state guar
23620 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a  antees that.  **
23630 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61   there is at lea
23640 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
23650 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
23660 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
23670 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  .  ** is a no-op
23680 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61   for that case a
23690 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75  nyhow..  */..  u
236a0 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  32 pageSize = *p
236b0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
236c0 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
236d0 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
236e0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
236f0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
23700 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70  IZE) );.  if( (p
23710 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
23720 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
23730 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69  e==0).   && sqli
23740 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
23750 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
23760 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67  e)==0 .   && pag
23770 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
23780 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e  e!=(u32)pPager->
23790 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20  pageSize .  ){. 
237a0 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
237b0 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20  NULL;           
237c0 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70    /* New temp sp
237d0 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e  ace */.    i64 n
237e0 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69  Byte = 0;..    i
237f0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
23800 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  e>PAGER_OPEN && 
23810 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23820 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  d) ){.      rc =
23830 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
23840 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
23850 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
23860 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23870 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  _OK ){.      pNe
23880 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
23890 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61  te3PageMalloc(pa
238a0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
238b0 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20  f( !pNew ) rc = 
238c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
238d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
238e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
238f0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
23900 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
23910 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
23920 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61  (Pgno)((nByte+pa
23930 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69  geSize-1)/pageSi
23940 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
23950 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
23960 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  geSize;.      sq
23970 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
23980 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
23990 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
239a0 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
239b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
239c0 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
239d0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
239e0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
239f0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65   }.  }..  *pPage
23a00 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
23a10 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72  ageSize;.  if( r
23a20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23a30 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65      if( nReserve
23a40 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20  <0 ) nReserve = 
23a50 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
23a60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
23a70 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
23a80 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20  serve<1000 );.  
23a90 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
23aa0 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72  ve = (i16)nReser
23ab0 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
23ac0 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
23ad0 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70  .    pagerFixMap
23ae0 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  limit(pPager);. 
23af0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
23b00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23b10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
23b20 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
23b30 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
23b40 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
23b50 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
23b60 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
23b70 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
23b80 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
23b90 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
23ba0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
23bb0 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
23bc0 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
23bd0 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
23be0 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
23bf0 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
23c00 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
23c10 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
23c20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
23c30 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
23c40 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
23c50 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
23c60 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
23c70 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
23c80 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
23c90 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
23ca0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
23cb0 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
23cc0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
23cd0 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
23ce0 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
23cf0 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
23d00 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
23d10 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
23d20 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
23d30 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
23d40 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
23d50 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
23d60 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
23d70 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
23d80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
23d90 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
23da0 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
23db0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
23dc0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
23dd0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
23de0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
23df0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
23e00 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
23e10 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
23e20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
23e30 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
23e40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
23e50 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
23e60 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20  ER_OPEN );      
23e70 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62  /* Called only b
23e80 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f  y OP_MaxPgcnt */
23e90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23ea0 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65  r->mxPgno>=pPage
23eb0 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a  r->dbSize );  /*
23ec0 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66   OP_MaxPgcnt enf
23ed0 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  orces this */.  
23ee0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
23ef0 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
23f00 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
23f10 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
23f20 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
23f30 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
23f40 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
23f50 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
23f60 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
23f70 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
23f80 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
23f90 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
23fa0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
23fb0 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
23fc0 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
23fd0 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
23fe0 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
23ff0 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
24000 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
24010 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
24020 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
24030 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
24040 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
24050 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
24060 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
24070 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
24080 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
24090 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
240a0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
240b0 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
240c0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
240d0 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
240e0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
240f0 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
24100 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
24110 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
24120 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
24130 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
24140 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
24150 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
24160 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24170 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
24180 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
24190 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
241a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
241b0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
241c0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
241d0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
241e0 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
241f0 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
24200 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
24210 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
24220 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
24230 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
24240 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
24250 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
24260 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
24270 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
24280 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
24290 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
242a0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
242b0 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
242c0 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
242d0 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
242e0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
242f0 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
24300 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
24310 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
24320 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
24330 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
24340 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
24350 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
24360 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
24370 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
24380 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
24390 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
243a0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
243b0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
243c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
243d0 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
243e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
243f0 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
24400 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
24410 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24420 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
24430 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
24440 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
24450 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
24460 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24470 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
24480 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
24490 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
244a0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
244b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
244c0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
244d0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
244e0 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64  d by btree immed
244f0 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65  iately after cre
24500 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50  ating.  ** the P
24510 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68  ager object.  Th
24520 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ere has not been
24530 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
24540 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20  to transition.  
24550 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79  ** to WAL mode y
24560 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
24570 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
24580 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
24590 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
245a0 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
245b0 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
245c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
245d0 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
245e0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
245f0 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
24600 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
24610 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
24620 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
24630 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
24640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
24650 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24660 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24670 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
24680 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74  ed when a read-t
24690 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
246a0 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  en on.** the pag
246b0 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74  er. It returns t
246c0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
246d0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
246e0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
246f0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
24700 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
24710 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
24720 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
24730 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
24740 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
24750 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76   page file..*/.v
24760 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
24770 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
24780 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
24790 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
247a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
247b0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
247c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
247d0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
247e0 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
247f0 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   );.  *pnPage = 
24800 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53  (int)pPager->dbS
24810 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.}.../*.** T
24820 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
24830 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b  ock of type lock
24840 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61  type on the data
24850 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a  base file. If.**
24860 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72   a similar or gr
24870 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c  eater lock is al
24880 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73  ready held, this
24890 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
248a0 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69  o-op.** (returni
248b0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d  ng SQLITE_OK imm
248c0 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ediately)..**.**
248d0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65   Otherwise, atte
248e0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  mpt to obtain th
248f0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c  e lock using sql
24900 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e  ite3OsLock(). In
24910 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73  voke .** the bus
24920 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
24930 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e  e lock is curren
24940 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
24950 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e  e. Repeat .** un
24960 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
24970 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61  lback returns fa
24980 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
24990 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
249a0 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
249b0 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
249c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
249d0 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
249e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
249f0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
24a00 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49  n.** the lock. I
24a10 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62  f the lock is ob
24a20 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75  tained successfu
24a30 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67  lly, set the Pag
24a40 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72  er.state .** var
24a50 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  iable to locktyp
24a60 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
24a70 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
24a80 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
24a90 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
24aa0 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
24ab0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
24ae0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
24af0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
24b00 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f  s is either a no
24b10 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65  -op (because the
24b20 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
24b30 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  is .  ** already
24b40 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66   held, or one of
24b50 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e   the transistion
24b60 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d  s that the busy-
24b70 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79  handler.  ** may
24b80 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69   be invoked duri
24b90 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ng, according to
24ba0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
24bb0 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  ve.  ** sqlite3P
24bc0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
24bd0 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
24be0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
24bf0 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20  ock>=locktype). 
24c00 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
24c10 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
24c20 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
24c30 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
24c40 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
24c50 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
24c60 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
24c70 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
24c80 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20    );..  do {.   
24c90 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
24ca0 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  b(pPager, lockty
24cb0 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  pe);.  }while( r
24cc0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
24cd0 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
24ce0 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
24cf0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
24d00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
24d10 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  }../*.** Functio
24d20 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  n assertTruncate
24d30 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
24d40 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f  r) checks that o
24d50 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f  ne of the .** fo
24d60 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
24d70 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  for all dirty pa
24d80 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
24d90 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a   the page-cache:
24da0 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20  .**.**   a) The 
24db0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c  page number is l
24dc0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
24dd0 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
24de0 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75   the .**      cu
24df0 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69  rrent database i
24e00 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  mage, in pages, 
24e10 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66  OR.**.**   b) if
24e20 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
24e30 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61  t were written a
24e40 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20  t this time, it 
24e50 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20  would not.**    
24e60 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74    be necessary t
24e70 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
24e80 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  ent content out 
24e90 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
24ea0 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64  al.**      (as d
24eb0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e  etermined by fun
24ec0 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72  ction subjRequir
24ed0 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  esPage())..**.**
24ee0 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   If the conditio
24ef0 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68  n asserted by th
24f00 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65  is function were
24f10 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74   not true, and t
24f20 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
24f30 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63   were to be disc
24f40 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63  arded from the c
24f50 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67  ache via the pag
24f60 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f  erStress().** ro
24f70 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65  utine, pagerStre
24f80 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77  ss() would not w
24f90 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
24fa0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f   page content to
24fb0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
24fc0 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65   file. If a save
24fd0 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
24fe0 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61  n were rolled ba
24ff0 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73  ck after.** this
25000 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63   happened, the c
25010 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
25020 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74  would be to rest
25030 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ore the current.
25040 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
25050 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c  e page. However,
25060 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74   since this cont
25070 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ent is not prese
25080 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  nt in either.** 
25090 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
250a0 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e  e or the portion
250b0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
250c0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a   journal and .**
250d0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   sub-journal rol
250e0 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e  led back the con
250f0 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  tent could not b
25100 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74  e restored and t
25110 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69  he.** database i
25120 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d  mage would becom
25130 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73  e corrupt. It is
25140 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75   therefore fortu
25150 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68  nate that .** th
25160 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20  is circumstance 
25170 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f  cannot arise..*/
25180 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
25190 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
251a0 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
251b0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
251c0 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  b(PgHdr *pPg){. 
251d0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
251e0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
251f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75  );.  assert( !su
25200 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
25210 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
25220 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  <=pPg->pPager->d
25230 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69  bSize );.}.stati
25240 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
25250 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25260 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
25270 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
25280 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
25290 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73  er->pPCache, ass
252a0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
252b0 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73  raintCb);.}.#els
252c0 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72  e.# define asser
252d0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
252e0 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64  int(pPager).#end
252f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  if../*.** Trunca
25300 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
25310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
25320 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61  mage to nPage pa
25330 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ges. This .** fu
25340 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
25350 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20  actually modify 
25360 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25370 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a  e on disk. It .*
25380 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  * just sets the 
25390 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
253a0 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
253b0 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a  ct so that the .
253c0 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69  ** truncation wi
253d0 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20  ll be done when 
253e0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
253f0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
25400 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tted..**.** This
25410 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
25420 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62  y called right b
25430 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67  efore committing
25440 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
25450 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e  ** Once this fun
25460 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
25470 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73  alled, the trans
25480 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68  action must eith
25490 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20  er be.** rolled 
254a0 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65  back or committe
254b0 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  d. It is not saf
254c0 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  e to call this f
254d0 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74  unction and.** t
254e0 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69  hen continue wri
254f0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
25500 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
25510 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
25520 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70  teImage(Pager *p
25530 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
25540 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
25550 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50  ager->dbSize>=nP
25560 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
25570 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
25580 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
25590 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67  CHEMOD );.  pPag
255a0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
255b0 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65  ge;..  /* At one
255c0 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20   point the code 
255d0 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65  here called asse
255e0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
255f0 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65  aint() to.  ** e
25600 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70  nsure that all p
25610 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63  ages being trunc
25620 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69  ated away by thi
25630 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c  s operation are,
25640 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20  .  ** if one or 
25650 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20  more savepoints 
25660 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e  are open, presen
25670 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69  t in the savepoi
25680 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  nt .  ** journal
25690 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
256a0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66  n be restored if
256b0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69   the savepoint i
256c0 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61  s rolled.  ** ba
256d0 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c  ck. This is no l
256e0 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20  onger necessary 
256f0 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  as this function
25700 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a   is now only.  *
25710 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62  * called right b
25720 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67  efore committing
25730 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
25740 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20  So although the 
25750 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65  .  ** Pager obje
25760 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76  ct may still hav
25770 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  e open savepoint
25780 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  s (Pager.nSavepo
25790 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74  int!=0), .  ** t
257a0 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  hey cannot be ro
257b0 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68  lled back. So th
257c0 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
257d0 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c  Constraint() cal
257e0 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e  l.  ** is no lon
257f0 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a  ger correct. */.
25800 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
25810 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
25820 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
25830 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
25840 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a  l rollback. It.*
25850 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  * syncs the jour
25860 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  nal file to disk
25870 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67  , then sets pPag
25880 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  er->journalHdr t
25890 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66  o the.** size of
258a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
258b0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  e so that the pa
258c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
258d0 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20  outine knows.** 
258e0 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20  that the entire 
258f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
25900 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a   been synced..**
25910 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f  .** Syncing a ho
25920 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73  t-journal to dis
25930 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  k before attempt
25940 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ing to roll it b
25950 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20  ack ensures .** 
25960 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d  that if a power-
25970 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64  failure occurs d
25980 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
25990 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20  ck, the process 
259a0 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73  that.** attempts
259b0 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
259c0 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76  ing system recov
259d0 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d  ery sees the sam
259e0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e  e journal.** con
259f0 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f  tent as this pro
25a00 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  cess..**.** If e
25a10 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
25a20 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54  s planned, SQLIT
25a30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
25a40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
25a50 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
25a60 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
25a70 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f   int pagerSyncHo
25a80 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
25a90 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
25aa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25ab0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
25ac0 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
25ad0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
25ae0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
25af0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
25b00 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
25b10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25b20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
25b30 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
25b40 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  fd, &pPager->jou
25b50 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20  rnalHdr);.  }.  
25b60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25b70 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66  .** Obtain a ref
25b80 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f  erence to a memo
25b90 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f  ry mapped page o
25ba0 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e  bject for page n
25bb0 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20  umber pgno. .** 
25bc0 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
25bd0 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e  ill use the poin
25be0 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69  ter pData, obtai
25bf0 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28  ned from xFetch(
25c00 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  )..** If success
25c10 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65  ful, set *ppPage
25c20 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
25c30 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72 65   new page refere
25c40 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  nce.** and retur
25c50 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  n SQLITE_OK. Oth
25c60 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
25c70 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
25c80 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a  ode and set.** *
25c90 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a  ppPage to zero..
25ca0 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72  **.** Page refer
25cb0 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62  ences obtained b
25cc0 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  y calling this f
25cd0 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
25ce0 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79  e released.** by
25cf0 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65   calling pagerRe
25d00 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a  leaseMapPage()..
25d10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
25d20 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
25d30 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
25d40 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
25d50 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
25d60 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ject */.  Pgno p
25d70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
25d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
25d90 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f  e number */.  vo
25da0 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  id *pData,      
25db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25dc0 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74 61   xFetch()'d data
25dd0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
25de0 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61  /.  PgHdr **ppPa
25df0 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ge              
25e00 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75      /* OUT: Acqu
25e10 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  ired page object
25e20 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a   */.){.  PgHdr *
25e30 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
25e40 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
25e50 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 74  ry mapped page t
25e60 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69  o return */..  i
25e70 66 28 20 70 50 61 67 65 72 2d 3e 70 46 72 65 65  f( pPager->pFree
25e80 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
25e90 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  = p = pPager->pF
25ea0 72 65 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ree;.    pPager-
25eb0 3e 70 46 72 65 65 20 3d 20 70 2d 3e 70 44 69 72  >pFree = p->pDir
25ec0 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
25ed0 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65  y = 0;.    memse
25ee0 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  t(p->pExtra, 0, 
25ef0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
25f00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
25f10 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48  pPage = p = (PgH
25f20 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  dr *)sqlite3Mall
25f30 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
25f40 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Hdr) + pPager->n
25f50 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20  Extra);.    if( 
25f60 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
25f70 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
25f80 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
25f90 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
25fa0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
25fb0 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ta);.      retur
25fc0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
25fd0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78      }.    p->pEx
25fe0 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  tra = (void *)&p
25ff0 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  [1];.    p->flag
26000 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a  s = PGHDR_MMAP;.
26010 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
26020 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d  .    p->pPager =
26030 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20   pPager;.  }..  
26040 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72  assert( p->pExtr
26050 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d  a==(void *)&p[1]
26060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26070 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >pPage==0 );.  a
26080 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d  ssert( p->flags=
26090 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20  =PGHDR_MMAP );. 
260a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
260b0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
260c0 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
260d0 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f  =1 );..  p->pgno
260e0 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44   = pgno;.  p->pD
260f0 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70  ata = pData;.  p
26100 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b  Pager->nMmapOut+
26110 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  +;..  return SQL
26120 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26130 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
26140 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67  ence to page pPg
26150 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20  . pPg must have 
26160 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79  been returned by
26170 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20   an .** earlier 
26180 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71  call to pagerAcq
26190 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  uireMapPage()..*
261a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
261b0 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
261c0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
261d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
261e0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
261f0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
26200 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  --;.  pPg->pDirt
26210 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 72 65  y = pPager->pFre
26220 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 72  e;.  pPager->pFr
26230 65 65 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73  ee = pPg;..  ass
26240 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d  ert( pPager->fd-
26250 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
26260 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69  ion>=3 );.  sqli
26270 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
26280 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
26290 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67  Pg->pgno-1)*pPag
262a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
262b0 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  g->pData);.}../*
262c0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48  .** Free all PgH
262d0 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65  dr objects store
262e0 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70  d in the Pager.p
262f0 46 72 65 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  Free list..*/.st
26300 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
26310 72 65 65 4d 61 70 48 64 72 73 28 50 61 67 65 72  reeMapHdrs(Pager
26320 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
26330 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a  dr *p;.  PgHdr *
26340 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
26350 50 61 67 65 72 2d 3e 70 46 72 65 65 3b 20 70 3b  Pager->pFree; p;
26360 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
26370 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  Next = p->pDirty
26380 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
26390 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(p);.  }.}.../
263a0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
263b0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
263c0 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
263d0 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
263e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
263f0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
26400 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
26410 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
26420 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
26430 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
26440 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
26450 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
26460 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
26470 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
26480 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
26490 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
264a0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
264b0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
264c0 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
264d0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
264e0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
264f0 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
26500 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
26510 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
26520 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
26530 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
26540 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
26550 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
26560 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
26570 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
26580 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
26590 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
265a0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
265b0 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
265c0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
265d0 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
265e0 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
265f0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
26600 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
26610 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
26620 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
26630 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
26640 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
26650 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
26660 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
26670 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
26680 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
26690 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
266a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
266b0 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64    pagerFreeMapHd
266c0 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  rs(pPager);.  /*
266d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
266e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
266f0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
26700 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
26710 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
26720 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
26730 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
26740 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
26750 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
26760 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20  eSize, pTmp);.  
26770 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30  pPager->pWal = 0
26780 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  ;.#endif.  pager
26790 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
267a0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
267b0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
267c0 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
267d0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
267e0 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
267f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
26800 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
26810 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
26820 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
26830 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
26840 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
26850 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
26860 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
26870 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
26880 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
26890 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
268a0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
268b0 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
268c0 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
268d0 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
268e0 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
268f0 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
26900 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
26910 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
26920 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
26930 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
26940 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
26950 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
26960 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
26970 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
26980 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
26990 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
269a0 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
269b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
269c0 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
269d0 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
269e0 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
269f0 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
26a00 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
26a10 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
26a20 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
26a30 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
26a40 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
26a50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26a70 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
26a80 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61  jfd) ){.      pa
26a90 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
26aa0 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  , pagerSyncHotJo
26ab0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a  urnal(pPager));.
26ac0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
26ad0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
26ae0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
26af0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
26b00 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
26b10 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
26b20 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
26b30 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
26b40 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
26b50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
26b60 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
26b70 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
26b80 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
26b90 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69  er->jfd);.  sqli
26ba0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
26bb0 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
26bc0 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
26bd0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
26be0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
26bf0 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
26c00 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
26c10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
26c20 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
26c30 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
26c40 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
26c50 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
26c60 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
26c70 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
26c80 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
26c90 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
26ca0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
26cb0 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
26cc0 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
26cd0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
26ce0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
26cf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
26d00 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
26d10 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
26d20 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
26d30 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
26d40 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
26d50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
26d60 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
26d70 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
26d80 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
26d90 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
26da0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
26db0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
26dc0 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
26dd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
26de0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
26df0 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
26e00 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
26e10 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
26e20 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
26e30 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
26e40 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
26e50 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
26e60 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
26e70 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
26e80 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
26e90 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
26ea0 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
26eb0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
26ec0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
26ed0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
26ee0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
26ef0 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
26f00 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
26f10 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
26f20 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
26f30 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
26f40 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
26f50 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
26f60 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
26f70 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
26f80 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
26f90 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
26fa0 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
26fb0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
26fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
26fd0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
26fe0 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
26ff0 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
27000 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
27010 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
27020 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
27030 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27040 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
27050 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
27060 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
27070 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
27080 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
27090 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
270a0 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
270b0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
270c0 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
270d0 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
270e0 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
270f0 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
27100 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
27110 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
27120 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
27130 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
27140 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27150 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
27160 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
27170 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
27180 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
27190 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
271a0 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
271b0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
271c0 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
271d0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
271e0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
271f0 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
27200 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
27210 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
27220 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
27230 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
27240 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
27250 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
27260 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
27270 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
27280 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
27290 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
272a0 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
272b0 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
272c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
272d0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
272e0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
272f0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
27300 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
27310 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
27320 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
27330 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
27340 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
27350 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
27360 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
27370 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
27380 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
27390 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
273a0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
273b0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
273c0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
273d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
273e0 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
273f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
27400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27410 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
27420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27430 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
27440 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
27450 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
27460 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
27470 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
27480 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
27490 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
274a0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
274b0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
274c0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
274d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
274e0 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
274f0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
27500 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
27510 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
27520 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
27530 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
27540 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
27550 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
27560 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
27570 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27580 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
27590 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
275a0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
275b0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
275c0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
275d0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
275e0 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
275f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27600 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
27610 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
27620 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
27630 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
27640 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
27650 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
27660 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
27670 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
27680 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
27690 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
276a0 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
276b0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
276c0 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
276d0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
276e0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
276f0 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
27700 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
27710 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
27720 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
27730 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
27740 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
27750 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
27760 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
27770 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
27780 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
27790 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
277a0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
277b0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
277c0 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
277d0 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
277e0 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
277f0 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
27800 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
27810 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
27820 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
27830 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
27840 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
27850 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
27860 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27870 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
27880 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
27890 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
278a0 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
278b0 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
278c0 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
278d0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
278e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
278f0 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
27900 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
27910 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
27920 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
27930 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
27940 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
27950 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
27960 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
27970 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
27980 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
27990 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
279a0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
279b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
279c0 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
279d0 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
279e0 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
279f0 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
27a00 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
27a10 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
27a20 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
27a30 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
27a40 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
27a50 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
27a60 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
27a70 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
27a80 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
27a90 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
27aa0 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
27ab0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
27ac0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
27ad0 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
27ae0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
27af0 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
27b00 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
27b10 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
27b20 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
27b30 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
27b40 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
27b50 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
27b60 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
27b70 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
27b80 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
27b90 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
27ba0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27bb0 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
27bc0 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
27bd0 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
27be0 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
27bf0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
27c00 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
27c10 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
27c20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
27c30 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
27c40 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
27c50 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
27c60 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
27c70 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
27c80 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
27c90 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
27ca0 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
27cb0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
27cc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27cd0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
27ce0 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
27cf0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
27d00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
27d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
27d20 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
27d30 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
27d40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
27d50 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
27d60 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
27d70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
27d80 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
27d90 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
27da0 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
27db0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
27dc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
27dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
27de0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
27df0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
27e00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
27e10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
27e20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
27e30 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
27e40 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
27e50 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
27e60 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
27e70 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
27e80 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
27e90 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
27ea0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
27eb0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
27ec0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
27ed0 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
27ee0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
27ef0 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
27f00 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
27f10 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
27f20 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
27f30 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
27f40 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
27f50 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
27f60 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
27f70 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
27f80 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
27f90 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
27fa0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
27fb0 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
27fc0 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
27fd0 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
27fe0 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
27ff0 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
28000 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
28010 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
28020 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
28030 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
28040 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
28050 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
28060 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
28070 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
28080 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
28090 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
280a0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
280b0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
280c0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
280d0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
280e0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
280f0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28100 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
28110 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
28120 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
28130 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
28140 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
28150 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
28160 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
28170 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
28180 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28190 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
281a0 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
281b0 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
281c0 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
281d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
281e0 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
281f0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
28200 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
28210 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
28220 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
28230 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
28240 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
28250 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28260 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28270 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28280 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
28290 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
282a0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
282b0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
282c0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
282d0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
282e0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
282f0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
28300 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
28310 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
28320 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
28330 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
28340 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
28350 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
28360 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
28370 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
28380 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
28390 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
283a0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
283b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
283c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
283d0 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
283e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
283f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28400 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
28410 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
28420 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
28430 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
28440 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
28450 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
28460 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
28470 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
28480 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28490 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
284a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
284b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
284c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
284d0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
284e0 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
284f0 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
28500 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
28510 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
28520 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
28530 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
28540 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
28550 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
28560 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
28570 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
28580 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
28590 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
285a0 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
285b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
285c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
285d0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
285e0 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
285f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
28600 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
28610 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
28620 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
28630 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
28640 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
28650 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
28660 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
28670 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
28680 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
28690 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
286a0 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
286b0 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
286c0 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
286d0 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
286e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
286f0 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
28700 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
28710 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
28720 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
28730 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
28740 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
28750 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
28760 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
28770 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
28780 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
28790 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
287a0 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
287b0 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
287c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
287d0 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
287e0 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
287f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
28800 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
28810 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
28820 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
28830 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
28840 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
28850 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
28860 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
28870 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
28880 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
28890 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
288a0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
288b0 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
288c0 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
288d0 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
288e0 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
288f0 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
28900 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
28910 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
28920 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
28930 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
28940 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
28950 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
28960 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
28970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
28980 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
28990 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
289a0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
289b0 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
289c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
289d0 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
289e0 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
289f0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
28a00 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
28a10 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
28a20 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
28a30 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
28a40 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
28a50 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
28a60 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
28a70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
28a80 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
28a90 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
28aa0 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
28ab0 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
28ac0 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
28ad0 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
28ae0 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
28af0 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
28b00 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
28b10 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
28b20 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
28b30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
28b40 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
28b50 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
28b60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
28b70 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
28b80 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
28b90 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
28ba0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
28bb0 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
28bc0 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
28bd0 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
28be0 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
28bf0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
28c00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
28c10 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
28c20 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
28c30 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
28c40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
28c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28c60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
28c70 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
28c80 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
28c90 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
28ca0 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
28cb0 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
28cc0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
28cd0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
28ce0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
28cf0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
28d00 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
28d10 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
28d20 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
28d30 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
28d40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
28d50 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
28d60 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
28d70 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
28d80 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
28d90 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
28da0 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
28db0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
28dc0 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
28dd0 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
28de0 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
28df0 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
28e00 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
28e10 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
28e20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
28e30 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
28e40 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
28e50 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
28e60 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
28e70 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
28e80 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
28e90 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
28ea0 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
28eb0 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
28ec0 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
28ed0 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
28ee0 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
28ef0 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
28f00 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
28f10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
28f20 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
28f30 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
28f40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28f50 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70  .   && (pList->p
28f60 44 69 72 74 79 20 3f 20 70 50 61 67 65 72 2d 3e  Dirty ? pPager->
28f70 64 62 53 69 7a 65 20 3a 20 70 4c 69 73 74 2d 3e  dbSize : pList->
28f80 70 67 6e 6f 2b 31 29 3e 70 50 61 67 65 72 2d 3e  pgno+1)>pPager->
28f90 64 62 48 69 6e 74 53 69 7a 65 20 0a 20 20 29 7b  dbHintSize .  ){
28fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
28fb0 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67  64 szFile = pPag
28fc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28  er->pageSize * (
28fd0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50  sqlite3_int64)pP
28fe0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
28ff0 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
29000 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
29010 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
29020 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
29030 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61  szFile);.    pPa
29040 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
29050 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
29060 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
29070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29080 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67   pList ){.    Pg
29090 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d  no pgno = pList-
290a0 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49  >pgno;..    /* I
290b0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
290c0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
290d0 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
290e0 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
290f0 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
29100 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
29110 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
29120 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
29130 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  ge() was called 
29140 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
29150 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
29160 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
29170 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
29180 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
29190 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
291a0 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
291b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
291c0 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69  Also, do not wri
291d0 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20  te out any page 
291e0 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48  that has the PGH
291f0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
29200 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73  ag.    ** set (s
29210 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
29220 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a  erDontWrite())..
29230 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
29240 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
29250 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
29260 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
29270 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
29280 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
29290 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
292a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
292b0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77    /* Offset to w
292c0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68  rite */.      ch
292d0 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ar *pData;      
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29300 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f  Data to write */
29310 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65      ..      asse
29320 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67  rt( (pList->flag
29330 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
29340 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  C)==0 );.      i
29350 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
29360 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f  1 ) pager_write_
29370 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c  changecounter(pL
29380 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ist);..      /* 
29390 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62  Encode the datab
293a0 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44  ase */.      COD
293b0 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73  EC2(pPager, pLis
293c0 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  t->pData, pgno, 
293d0 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  6, return SQLITE
293e0 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a  _NOMEM, pData);.
293f0 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
29400 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
29410 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
29420 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
29430 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
29440 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
29450 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
29460 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
29470 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
29480 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
29490 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
294a0 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
294b0 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
294c0 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
294d0 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
294e0 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
294f0 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
29500 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29510 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
29520 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
29530 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
29540 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
29550 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
29560 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
29570 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
29580 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
29590 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
295a0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
295b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
295c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
295d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
295e0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
295f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
29600 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
29610 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20  WRITE]++;..     
29620 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
29630 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
29640 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
29650 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
29660 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
29670 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
29680 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
29690 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
296a0 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
296b0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
296c0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
296d0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
296e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29700 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
29710 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
29720 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
29730 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
29740 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
29750 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
29760 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
29770 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
29780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29790 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
297a0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
297b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
297c0 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
297d0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
297e0 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  t_pagehash(pList
297f0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
29800 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
29810 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
29820 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
29830 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75  that the sub-jou
29840 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
29850 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  n. If it is alre
29860 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a  ady open, this .
29870 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
29880 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
29890 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
298a0 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
298b0 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
298c0 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a   to plan. An .**
298d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
298e0 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
298f0 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
29900 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f  ll to sqlite3OsO
29910 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e  pen() .** fails.
29920 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
29930 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
29940 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
29950 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29960 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  OK;.  if( !isOpe
29970 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
29980 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
29990 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
299a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
299b0 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67  E_MEMORY || pPag
299c0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
299d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
299e0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
299f0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
29a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29a10 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
29a20 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
29a30 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f  r->sjfd, SQLITE_
29a40 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29  OPEN_SUBJOURNAL)
29a50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
29a60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29a70 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72  * Append a recor
29a80 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
29a90 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70   state of page p
29aa0 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  Pg to the sub-jo
29ab0 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73  urnal. .** It is
29ac0 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
29ad0 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75  ponsibility to u
29ae0 73 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  se subjRequiresP
29af0 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a  age() to check .
29b00 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65  ** that it is re
29b10 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65  ally required be
29b20 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
29b30 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
29b40 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
29b50 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
29b60 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
29b70 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
29b80 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
29b90 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
29ba0 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
29bb0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
29bc0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
29bd0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
29be0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
29bf0 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
29c00 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
29c10 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
29c20 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
29c30 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
29c40 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
29c50 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
29c60 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
29c70 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
29c80 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
29c90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
29ca0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
29cb0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
29cc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29cd0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
29ce0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
29cf0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
29d00 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
29d10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
29d20 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
29d30 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
29d40 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
29d50 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
29d60 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
29d70 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
29d80 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
29d90 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
29da0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
29db0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
29dc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
29dd0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
29de0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
29df0 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
29e00 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
29e10 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
29e20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
29e30 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20  Journal(pPg) .  
29e40 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70         || pPg->p
29e50 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
29e60 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20  igSize .    );. 
29e70 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a     rc = openSubJ
29e80 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
29e90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
29ea0 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f  ub-journal was o
29eb0 70 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  pened successful
29ec0 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61  ly (or was alrea
29ed0 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a  dy open),.    **
29ee0 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e   write the journ
29ef0 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  al record into t
29f00 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  he file.  */.   
29f10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29f20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  OK ){.      void
29f30 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
29f40 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20  Data;.      i64 
29f50 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 50  offset = (i64)pP
29f60 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34  ager->nSubRec*(4
29f70 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
29f80 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e);.      char *
29f90 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20  pData2;.  .     
29fa0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
29fb0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
29fc0 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
29fd0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
29fe0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  );.      PAGERTR
29ff0 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
2a000 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
2a010 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2a020 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2a030 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
2a040 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
2a050 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
2a060 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
2a070 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a080 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2a090 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2a0a0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
2a0b0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
2a0c0 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
2a0d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a0e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2a0f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a100 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b  pPager->nSubRec+
2a110 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
2a120 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2a130 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  t>0 );.    rc = 
2a140 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
2a150 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
2a160 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
2a170 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a180 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a190 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
2a1a0 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20  he pcache layer 
2a1b0 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63  when it has reac
2a1c0 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74  hed some.** soft
2a1d0 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54   memory limit. T
2a1e0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
2a1f0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
2a200 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74  o a Pager object
2a210 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76  .** (cast as a v
2a220 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72  oid*). The pager
2a230 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67   is always 'purg
2a240 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69  eable' (not an i
2a250 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61  n-memory.** data
2a260 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e  base). The secon
2a270 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
2a280 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70  reference to a p
2a290 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20  age that is .** 
2a2a0 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
2a2b0 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  but has no outst
2a2c0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
2a2d0 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69  s. The page.** i
2a2e0 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61  s always associa
2a2f0 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67  ted with the Pag
2a300 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  er object passed
2a310 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a   as the first .*
2a320 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
2a330 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
2a340 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f  s function is to
2a350 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20   make pPg clean 
2a360 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63  by writing its c
2a370 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74  ontents.** out t
2a380 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2a390 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  ile, if possible
2a3a0 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c  . This may invol
2a3b0 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a  ve syncing the.*
2a3c0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
2a3d0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2a3e0 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61  sful, sqlite3Pca
2a3f0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
2a400 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
2a410 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  page and.** SQLI
2a420 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2a430 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2a440 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2a450 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ng to make the.*
2a460 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68  * page clean, th
2a470 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
2a480 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
2a490 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  the page cannot 
2a4a0 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e  be.** made clean
2a4b0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
2a4c0 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65  reason, but no e
2a4d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
2a4e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
2a4f0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  s returned by sq
2a500 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2a510 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61  lean() is not ca
2a520 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
2a530 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28  int pagerStress(
2a540 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a  void *p, PgHdr *
2a550 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
2a560 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
2a570 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  )p;.  int rc = S
2a580 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2a590 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
2a5a0 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
2a5b0 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
2a5c0 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
2a5d0 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  /* The doNotS
2a5e0 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 69 73  yncSpill flag is
2a5f0 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65   set during time
2a600 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73  s when doing a s
2a610 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72  ync of.  ** jour
2a620 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20  nal (and adding 
2a630 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73  a new header) is
2a640 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54   not allowed.  T
2a650 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  his occurs.  ** 
2a660 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20  during calls to 
2a670 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a680 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67  e() while trying
2a690 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74   to journal mult
2a6a0 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  iple.  ** pages 
2a6b0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
2a6c0 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20   same sector..  
2a6d0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f  **.  ** The doNo
2a6e0 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69  tSpill flag inhi
2a6f0 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
2a700 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c 65  pilling regardle
2a710 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a 20 20  ss of whether.  
2a720 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  ** or not a sync
2a730 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
2a740 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
2a750 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  g a rollback..  
2a760 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67  **.  ** Spilling
2a770 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69   is also prohibi
2a780 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65  ted when in an e
2a790 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65  rror state since
2a7a0 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a   that could.  **
2a7b0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
2a7c0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20  e corruption.   
2a7d0 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
2a7e0 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74 20  mplementaton it 
2a7f0 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69  .  ** is impossi
2a800 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50  ble for sqlite3P
2a810 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20  cacheFetch() to 
2a820 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63  be called with c
2a830 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20 20 2a  reateFlag==1.  *
2a840 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65  * while in the e
2a850 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63  rror state, henc
2a860 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  e it is impossib
2a870 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
2a880 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63  ine to.  ** be c
2a890 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72  alled in the err
2a8a0 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72  or state.  Never
2a8b0 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c  theless, we incl
2a8c0 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20  ude a NEVER().  
2a8d0 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20  ** test for the 
2a8e0 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61  error state as a
2a8f0 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e   safeguard again
2a900 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65  st future change
2a910 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45  s..  */.  if( NE
2a920 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
2a930 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51  ode) ) return SQ
2a940 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
2a950 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2a960 6c 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  l ) return SQLIT
2a970 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2a980 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
2a990 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  ll && (pPg->flag
2a9a0 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
2a9b0 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  YNC)!=0 ){.    r
2a9c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a9d0 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69  .  }..  pPg->pDi
2a9e0 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rty = 0;.  if( p
2a9f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2aa00 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69  r) ){.    /* Wri
2aa10 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  te a single fram
2aa20 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  e for this page 
2aa30 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20  to the log. */. 
2aa40 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
2aa50 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20  resPage(pPg) ){ 
2aa60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
2aa70 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2aa80 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20   .    }.    if( 
2aa90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2aaa0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2aab0 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
2aac0 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20  r, pPg, 0, 0);. 
2aad0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2aae0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
2aaf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
2ab00 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2ab10 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
2ab20 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2ab30 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72   .     || pPager
2ab40 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2ab50 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
2ab60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
2ab70 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
2ab80 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  ager, 1);.    }.
2ab90 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
2aba0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2abb0 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72  this page is lar
2abc0 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ger than the cur
2abd0 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20  rent size of.   
2abe0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2abf0 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e   image, it may n
2ac00 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65  eed to be writte
2ac10 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
2ac20 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69  rnal..    ** Thi
2ac30 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
2ac40 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
2ac50 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
2ac60 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
2ac70 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77     ** actually w
2ac80 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
2ac90 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
2aca0 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
2acb0 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66  * Consider the f
2acc0 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63  ollowing sequenc
2acd0 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20  e of events:.   
2ace0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47   **.    **   BEG
2acf0 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c  IN;.    **     <
2ad00 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a  journal page X>.
2ad10 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69      **     <modi
2ad20 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  fy page X>.    *
2ad30 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
2ad40 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sp;.    **      
2ad50 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73   <shrink databas
2ad60 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65  e file to Y page
2ad70 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s>.    **       
2ad80 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65  pagerStress(page
2ad90 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52   X).    **     R
2ada0 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20  OLLBACK TO sp;. 
2adb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2adc0 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e  (X>Y), then when
2add0 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20   pagerStress is 
2ade0 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69  called page X wi
2adf0 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
2ae00 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  n.    ** out to 
2ae10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ae20 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64  e, but will be d
2ae30 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ropped from the 
2ae40 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20  cache. Then,.   
2ae50 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
2ae60 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
2ae70 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65  p" statement, re
2ae80 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c  ading page X wil
2ae90 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61  l read.    ** da
2aea0 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
2aeb0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
2aec0 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
2aed0 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
2aee0 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e  .    ** was when
2aef0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2af00 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73   started, not as
2af10 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41   it was when "SA
2af20 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20  VEPOINT sp".    
2af30 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e  ** was executed.
2af40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2af50 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
2af60 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
2af70 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67  ent data for pag
2af80 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  e X into the .  
2af90 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
2afa0 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74   file now (if it
2afb0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2afc0 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20  there), so that 
2afd0 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  it will.    ** b
2afe0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
2aff0 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
2b000 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
2b010 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20  CK TO sp" is .  
2b020 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20    ** executed.. 
2b030 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45     */.    if( NE
2b040 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d  VER(.        rc=
2b050 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2b060 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
2b070 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65  dbSize && subjRe
2b080 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a  quiresPage(pPg).
2b090 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72      ) ){.      r
2b0a0 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
2b0b0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
2b0c0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
2b0d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b0e0 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
2b0f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b100 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
2b110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b120 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67      assert( (pPg
2b130 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2b140 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2b150 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2b160 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
2b170 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20  Pager, pPg);.   
2b180 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72   }.  }..  /* Mar
2b190 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
2b1a0 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ean. */.  if( rc
2b1b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b1c0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b1d0 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25  STRESS %d page %
2b1e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2b1f0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2b200 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
2b210 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
2b220 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
2b230 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2b240 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a  Pager, rc); .}..
2b250 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2b260 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
2b270 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
2b280 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
2b290 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
2b2a0 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
2b2b0 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
2b2c0 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
2b2d0 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
2b2e0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
2b2f0 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
2b300 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
2b310 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
2b320 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2b330 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
2b340 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
2b350 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
2b360 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
2b370 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
2b380 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
2b390 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
2b3a0 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
2b3b0 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
2b3c0 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
2b3d0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
2b3e0 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
2b3f0 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
2b400 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
2b410 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
2b420 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
2b430 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
2b440 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
2b450 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
2b460 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
2b470 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
2b480 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
2b490 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
2b4a0 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
2b4b0 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
2b4c0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
2b4d0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
2b4e0 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
2b4f0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
2b500 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
2b510 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
2b520 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
2b530 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
2b540 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
2b550 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
2b560 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
2b570 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
2b580 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
2b590 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
2b5a0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
2b5b0 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
2b5c0 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
2b5d0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
2b5e0 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e  e PAGER_* flags.
2b5f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c  .**.** The vfsFl
2b600 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  ags parameter is
2b610 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61   a bitmask to pa
2b620 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20  ss to the flags 
2b630 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
2b640 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  the xOpen() meth
2b650 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  od of the suppli
2b660 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e  ed VFS when open
2b670 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a  ing files. .**.*
2b680 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f  * If the pager o
2b690 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
2b6a0 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ed and the speci
2b6b0 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64  fied file opened
2b6c0 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
2b6d0 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y, SQLITE_OK is 
2b6e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2b6f0 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69  Pager set to poi
2b700 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
2b710 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
2b720 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2b730 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73  s, *ppPager is s
2b740 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e  et to NULL.** an
2b750 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  d error code ret
2b760 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63  urned. This func
2b770 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2b780 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
2b790 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29  (sqlite3Malloc()
2b7a0 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
2b7b0 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51  cate memory), SQ
2b7c0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72  LITE_CANTOPEN or
2b7d0 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c   .** various SQL
2b7e0 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72  ITE_IO_XXX error
2b7f0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2b800 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
2b810 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2b820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2b830 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
2b840 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
2b850 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
2b860 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2b870 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
2b880 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2b890 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2b8a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
2b8b0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2b8c0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2b8d0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
2b8e0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
2b8f0 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
2b900 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
2b910 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2b920 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2b930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2b940 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
2b950 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
2b960 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
2b970 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2b980 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
2b990 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
2b9a0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64  Open() */.  void
2b9b0 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
2b9c0 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  ge*) /* Function
2b9d0 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   to reinitialize
2b9e0 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   pages */.){.  u
2b9f0 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
2ba00 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20   *pPager = 0;   
2ba10 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2ba20 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ect to allocate 
2ba30 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2ba40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2ba50 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
2ba60 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2ba70 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20   tempFile = 0;  
2ba80 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2ba90 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e  r temp files (in
2baa0 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  cl. in-memory fi
2bab0 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  les) */.  int me
2bac0 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mDb = 0;        
2bad0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2bae0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2baf0 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ry file */.  int
2bb00 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2bb10 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2bb20 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2bb30 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2bb40 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2bb50 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2bb60 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2bb70 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2bb80 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2bb90 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2bba0 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2bbb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2bbc0 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2bbd0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2bbe0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2bbf0 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2bc00 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2bc10 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2bc20 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2bc30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2bc40 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2bc50 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2bc60 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2bc70 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2bc80 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2bc90 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2bca0 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2bcb0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2bcc0 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2bcd0 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2bce0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2bcf0 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2bd00 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2bd10 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2bd20 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2bd30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2bd40 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2bd50 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2bd60 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2bd70 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2bd80 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2bd90 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2bda0 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2bdb0 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2bdc0 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2bdd0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2bde0 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
2bdf0 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
2be00 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
2be10 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
2be20 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
2be30 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
2be40 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
2be50 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
2be60 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
2be70 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
2be80 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
2be90 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
2bea0 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
2beb0 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
2bec0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
2bed0 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
2bee0 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
2bef0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2bf00 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
2bf10 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
2bf20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
2bf30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
2bf40 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2bf50 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
2bf60 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
2bf70 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2bf80 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2bf90 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2bfa0 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
2bfb0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2bfc0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2bfd0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
2bfe0 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
2bff0 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
2c000 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
2c010 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
2c020 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
2c030 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23  *ppPager = 0;..#
2c040 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c050 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66  IT_MEMORYDB.  if
2c060 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ( flags & PAGER_
2c070 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65  MEMORY ){.    me
2c080 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  mDb = 1;.    if(
2c090 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2c0a0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2c0b0 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2c0c0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
2c0d0 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  0, zFilename);. 
2c0e0 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61       if( zPathna
2c0f0 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20  me==0  ) return 
2c100 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c110 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2c120 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c130 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2c140 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
2c150 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2c160 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  f..  /* Compute 
2c170 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
2c180 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
2c190 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
2c1a0 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
2c1b0 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
2c1c0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
2c1d0 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
2c1e0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2c1f0 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
2c200 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
2c210 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
2c220 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
2c230 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2c240 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2c250 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2c260 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2c270 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2c280 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
2c290 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  me = sqlite3DbMa
2c2a0 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68  llocRaw(0, nPath
2c2b0 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
2c2c0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
2c2d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2c2e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2c2f0 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b  }.    zPathname[
2c300 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
2c310 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
2c320 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
2c330 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
2c340 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2c350 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
2c360 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
2c370 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
2c380 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74  hname);.    nPat
2c390 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2c3a0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2c3b0 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69  e);.    z = zUri
2c3c0 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71   = &zFilename[sq
2c3d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
2c3e0 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20  ilename)+1];.   
2c3f0 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
2c400 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2c410 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2c420 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2c430 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2c440 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d      }.    nUri =
2c450 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a   (int)(&z[1] - z
2c460 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Uri);.    assert
2c470 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20  ( nUri>=0 );.   
2c480 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c490 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
2c4a0 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
2c4b0 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
2c4c0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
2c4d0 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
2c4e0 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
2c4f0 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
2c500 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
2c510 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
2c520 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
2c530 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
2c540 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
2c550 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
2c560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
2c570 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
2c580 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
2c590 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
2c5a0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
2c5b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
2c5c0 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
2c5d0 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
2c5e0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
2c5f0 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
2c600 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c610 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
2c620 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2c630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c640 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2c650 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2c660 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2c670 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
2c680 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
2c690 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
2c6a0 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
2c6b0 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
2c6c0 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
2c6d0 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
2c6e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
2c6f0 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
2c700 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
2c710 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
2c720 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
2c730 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
2c740 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
2c750 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2c760 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
2c770 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
2c780 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
2c790 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2c7a0 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
2c7b0 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
2c7c0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2c7d0 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
2c7e0 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
2c7f0 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
2c800 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
2c810 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2c820 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
2c830 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2c840 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
2c850 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2c860 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
2c870 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2c880 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2c890 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2c8b0 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
2c8c0 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
2c8d0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2c8e0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2c8f0 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
2c900 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
2c910 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2c920 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
2c930 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2c940 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
2c950 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
2c960 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
2c970 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
2c980 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
2c990 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
2c9a0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2c9b0 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
2c9c0 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
2c9d0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2c9e0 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
2c9f0 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
2ca00 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
2ca10 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2ca20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20  1 + nUri +      
2ca30 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2ca40 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
2ca50 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20   + 8 + 2        
2ca60 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
2ca70 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  l */.#ifndef SQL
2ca80 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2ca90 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   + nPathname + 4
2caa0 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2cab0 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69  /* zWal */.#endi
2cac0 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f.  );.  assert(
2cad0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2cae0 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
2caf0 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
2cb00 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
2cb10 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
2cb20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2cb30 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2cb40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2cb50 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
2cb60 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2cb70 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2cb80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2cb90 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2cba0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2cbb0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2cbc0 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2cbd0 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2cbe0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2cbf0 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2cc00 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2cc10 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2cc20 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2cc30 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2cc40 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2cc50 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2cc60 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2cc70 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2cc80 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2cc90 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2cca0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2ccb0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2ccc0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2ccd0 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2cce0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2ccf0 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2cd00 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2cd10 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2cd20 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2cd30 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2cd40 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2cd50 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2cd60 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2cd70 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2cd80 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2cd90 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2cda0 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2cdb0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2cdc0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2cdd0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
2cde0 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79  f( nUri ) memcpy
2cdf0 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2ce00 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2ce10 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2ce20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2ce30 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2ce40 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2ce50 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2ce60 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2ce70 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2ce80 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29  urnal\000", 8+2)
2ce90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2cea0 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2ceb0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2cec0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2ced0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2cee0 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2cef0 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2cf00 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2cf10 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2cf20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2cf30 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2cf40 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2cf50 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2cf60 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2cf70 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31   "-wal\000", 4+1
2cf80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2cf90 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2cfa0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2cfb0 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64  ger->zWal);.#end
2cfc0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  if.    sqlite3Db
2cfd0 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2cfe0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2cff0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2d000 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2d010 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2d020 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2d030 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2d040 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2d050 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2d060 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2d070 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d080 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2d090 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2d0a0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2d0b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2d0c0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2d0d0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d0e0 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2d0f0 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2d100 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2d110 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2d120 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2d130 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2d140 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2d150 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2d160 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2d170 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2d180 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2d190 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2d1a0 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2d1b0 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2d1c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2d1d0 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2d1e0 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2d1f0 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2d200 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2d210 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2d220 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2d230 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2d240 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2d250 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2d260 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2d270 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2d280 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2d290 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2d2a0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2d2b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d2c0 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
2d2d0 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
2d2e0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
2d2f0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2d300 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d310 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
2d320 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50  );.      if( szP
2d340 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
2d350 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
2d360 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2d370 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2d380 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2d390 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2d3a0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2d3b0 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2d3c0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d3d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2d3e0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
2d3f0 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2d400 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2d410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d420 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2d430 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2d440 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  RITE.      {.   
2d450 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2d460 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2d470 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2d480 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2d490 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2d4a0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2d4b0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2d4c0 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2d4d0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2d4e0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
2d4f0 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
2d500 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d510 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2d520 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2d530 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  536);.        fo
2d540 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
2d550 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
2d560 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2d570 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
2d580 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
2d590 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2d5a0 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2d5c0 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
2d5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d5e0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2d5f0 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  f.    }.  }else{
2d600 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
2d610 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
2d620 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
2d630 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
2d640 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
2d650 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
2d660 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
2d670 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
2d680 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
2d690 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
2d6a0 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
2d6b0 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
2d6c0 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
2d6d0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
2d6e0 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
2d6f0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
2d700 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
2d710 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
2d720 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
2d730 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
2d740 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
2d750 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
2d760 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
2d770 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
2d780 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
2d790 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  al..    */ .    
2d7a0 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
2d7b0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2d7c0 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
2d7d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f  .    pPager->eLo
2d7e0 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  ck = EXCLUSIVE_L
2d7f0 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  OCK;.    readOnl
2d800 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2d810 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2d820 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2d830 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2d840 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2d850 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2d860 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2d870 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2d880 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2d890 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2d8a0 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2d8b0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2d8c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d8d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d8e0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2d8f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d900 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2d910 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2d920 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2d930 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2d940 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2d950 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2d960 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68  occurred in eith
2d970 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
2d980 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
2d990 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72   .  ** Pager str
2d9a0 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
2d9b0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
2d9c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d9d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2d9e0 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  t( !pPager->pTmp
2d9f0 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c  Space );.    sql
2da00 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2da10 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
2da20 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2da30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2da40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2da50 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2da60 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61  e object. */.  a
2da70 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
2da80 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d  00 );.  nExtra =
2da90 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
2daa0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2dab0 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2dac0 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2dad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dae0 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
2daf0 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
2db00 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
2db10 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
2db20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45  PAGERTRACE(("OPE
2db30 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
2db40 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
2db50 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
2db60 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54  ilename));.  IOT
2db70 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
2db80 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
2db90 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2dba0 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  )..  pPager->use
2dbb0 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
2dbc0 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70  eJournal;.  /* p
2dbd0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
2dbe0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2dbf0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
2dc00 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2dc10 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
2dc20 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2dc30 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
2dc40 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2dc50 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
2dc60 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
2dc70 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2dc80 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
2dc90 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
2dca0 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
2dcb0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
2dcc0 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20  LOCK; */.#if 0. 
2dcd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2dce0 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46  >state == (tempF
2dcf0 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c  ile ? PAGER_EXCL
2dd00 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e  USIVE : PAGER_UN
2dd10 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a  LOCK) );.#endif.
2dd20 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
2dd30 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
2dd40 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2dd50 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a  = (u8)tempFile;.
2dd60 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
2dd70 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2dd80 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
2dd90 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
2dda0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2ddb0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2ddc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2ddd0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2dde0 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
2ddf0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
2de00 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65  iveMode = (u8)te
2de10 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
2de20 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2de30 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
2de40 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
2de50 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d  >memDb = (u8)mem
2de60 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
2de70 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61  adOnly = (u8)rea
2de80 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28  dOnly;.  assert(
2de90 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70   useJournal || p
2dea0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2deb0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
2dec0 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
2ded0 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50  mpFile;.  if( pP
2dee0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
2def0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2df00 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20  er->fullSync==0 
2df10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2df20 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2df30 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2df40 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t( pPager->walSy
2df50 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2df60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2df70 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d  ->ckptSyncFlags=
2df80 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
2df90 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
2dfa0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ync = 1;.    pPa
2dfb0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
2dfc0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2dfd0 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
2dfe0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20  >walSyncFlags = 
2dff0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2e000 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52  AL | WAL_SYNC_TR
2e010 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20  ANSACTIONS;.    
2e020 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2e030 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2e040 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  YNC_NORMAL;.  }.
2e050 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2e060 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
2e070 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
2e080 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
2e090 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
2e0a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2e0b0 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
2e0c0 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
2e0d0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2e0e0 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
2e0f0 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
2e100 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
2e110 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2e120 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
2e130 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
2e140 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2e150 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
2e160 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2e170 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2e180 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2e190 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
2e1a0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
2e1b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2e1c0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2e1d0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
2e1e0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
2e1f0 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
2e200 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e210 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
2e220 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2e230 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
2e240 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
2e250 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
2e260 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
2e270 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
2e280 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
2e290 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
2e2a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
2e2b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2e2c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
2e2d0 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
2e2e0 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
2e2f0 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
2e300 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
2e310 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
2e320 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2e330 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
2e340 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2e350 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
2e360 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
2e370 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
2e380 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2e390 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
2e3a0 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
2e3b0 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
2e3c0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
2e3d0 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
2e3e0 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
2e3f0 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
2e400 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2e410 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
2e420 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
2e430 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
2e440 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2e450 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2e460 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2e470 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
2e480 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2e490 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
2e4a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
2e4b0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
2e4c0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
2e4d0 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
2e4e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2e4f0 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
2e500 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
2e510 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
2e520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e530 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
2e540 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
2e550 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
2e560 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
2e570 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
2e580 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
2e590 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2e5a0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
2e5b0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2e5c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
2e5d0 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
2e5e0 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
2e5f0 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2e600 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2e610 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
2e620 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2e630 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
2e640 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
2e650 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2e660 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
2e670 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2e680 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
2e690 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
2e6a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2e6b0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2e6c0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
2e6d0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2e6e0 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
2e6f0 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
2e700 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
2e710 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
2e720 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
2e730 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
2e740 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
2e750 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
2e760 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2e770 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
2e780 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
2e790 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
2e7a0 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
2e7b0 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
2e7c0 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
2e7d0 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
2e7e0 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
2e7f0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2e800 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2e810 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
2e820 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
2e830 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2e840 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2e850 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2e860 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2e870 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
2e880 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2e890 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2e8a0 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
2e8b0 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
2e8c0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2e8d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
2e8e0 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
2e8f0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2e900 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
2e910 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2e920 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
2e930 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
2e940 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
2e950 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
2e960 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2e970 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e980 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2e990 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20   exists = 1;    
2e9a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2e9b0 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
2e9c0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
2e9d0 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65  */.  int jrnlOpe
2e9e0 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61  n = !!isOpen(pPa
2e9f0 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73  ger->jfd);..  as
2ea00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2ea10 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
2ea20 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2ea30 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
2ea40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2ea50 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2ea60 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a   );..  assert( j
2ea70 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20  rnlOpen==0 || ( 
2ea80 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2ea90 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2eaa0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20  Pager->jfd) &.  
2eab0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
2eac0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
2ead0 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70  OPEN.  ));..  *p
2eae0 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66  Exists = 0;.  if
2eaf0 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2eb00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2eb10 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
2eb20 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2eb30 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2eb40 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
2eb50 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2eb60 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
2eb70 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
2eb80 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
2eb90 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2eba0 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
2ebb0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2ebc0 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
2ebd0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
2ebe0 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
2ebf0 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
2ec00 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
2ec10 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
2ec20 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
2ec30 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
2ec40 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
2ec50 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
2ec60 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
2ec70 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
2ec80 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
2ec90 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
2eca0 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
2ecb0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2ecc0 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
2ecd0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
2ece0 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
2ecf0 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
2ed00 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
2ed10 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
2ed20 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2ed30 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
2ed40 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
2ed50 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
2ed60 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
2ed70 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
2ed80 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
2ed90 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
2eda0 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
2edb0 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
2edc0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2edd0 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2ede0 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
2edf0 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
2ee00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ee10 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
2ee20 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2ee30 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2ee40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2ee50 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
2ee60 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2ee70 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65      /* Check the
2ee80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2ee90 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69  abase file. If i
2eea0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20  t consists of 0 
2eeb0 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20  pages,.      ** 
2eec0 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
2eed0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65  journal file. Se
2eee0 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
2eef0 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a  ment above for .
2ef00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61        ** the rea
2ef10 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65  soning here.  De
2ef20 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74  lete the obsolet
2ef30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75  e journal file u
2ef40 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20  nder.      ** a 
2ef50 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
2ef60 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64   avoid race cond
2ef70 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76  itions and to av
2ef80 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20  oid violating.  
2ef90 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e      ** [H33020].
2efa0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2efb0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
2efc0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
2efd0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2efe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2eff0 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
2f000 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2f010 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
2f020 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2f030 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
2f040 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
2f050 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
2f060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f070 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f080 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
2f090 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2f0a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2f0b0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
2f0c0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
2f0d0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
2f0e0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2f0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f100 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2f110 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
2f120 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2f130 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2f140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2f150 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
2f160 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
2f170 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
2f180 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
2f190 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2f1a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2f1b0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2f1c0 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
2f1d0 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
2f1e0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
2f1f0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2f200 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f210 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
2f220 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
2f230 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
2f240 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
2f250 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
2f260 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
2f270 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
2f280 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2f290 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
2f2a0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2f2b0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
2f2c0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
2f2d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f2e0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
2f2f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f300 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2f310 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2f320 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
2f330 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
2f340 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2f350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f360 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
2f370 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
2f380 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f390 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
2f3a0 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
2f3b0 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
2f3c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2f3d0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
2f3e0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
2f3f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2f400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2f410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f420 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
2f430 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2f440 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2f450 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
2f460 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2f470 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
2f480 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
2f490 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2f4a0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2f4b0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
2f4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
2f4d0 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
2f4e0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2f4f0 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
2f500 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
2f510 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61         ** its ha
2f520 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
2f530 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
2f540 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
2f550 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
2f560 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
2f570 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
2f580 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
2f590 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
2f5a0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
2f5b0 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
2f5c0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
2f5d0 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
2f5e0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
2f5f0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
2f600 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
2f610 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
2f620 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
2f630 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
2f640 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
2f650 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
2f660 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
2f670 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
2f680 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
2f690 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
2f6a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
2f6b0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
2f6c0 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
2f6d0 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
2f6e0 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
2f6f0 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
2f700 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f710 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
2f720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2f730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f750 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2f760 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2f770 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2f780 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2f790 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
2f7a0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
2f7b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f7c0 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
2f7d0 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
2f7e0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
2f7f0 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
2f800 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
2f810 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
2f820 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
2f830 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
2f840 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
2f850 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
2f860 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
2f870 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
2f880 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2f890 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
2f8a0 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
2f8b0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
2f8c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
2f8d0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
2f8e0 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
2f8f0 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c  OPEN state (no l
2f900 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20  ock held.**     
2f910 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2f920 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20   file), then an 
2f930 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
2f940 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20  to obtain a.**  
2f950 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20      SHARED lock 
2f960 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2f970 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c  file. Immediatel
2f980 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
2f990 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48  g.**      the SH
2f9a0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66  ARED lock, the f
2f9b0 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68  ile-system is ch
2f9c0 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d  ecked for a hot-
2f9d0 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20  journal,.**     
2f9e0 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64   which is played
2f9f0 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74   back if present
2fa00 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20  . Following any 
2fa10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  hot-journal .** 
2fa20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74       rollback, t
2fa30 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2fa40 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c  he cache are val
2fa50 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69  idated by checki
2fa60 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27  ng.**      the '
2fa70 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20  change-counter' 
2fa80 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74  field of the dat
2fa90 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
2faa0 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69  r and.**      di
2fab0 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20  scarded if they 
2fac0 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  are found to be 
2fad0 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20  invalid..**.**  
2fae0 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72   2) If the pager
2faf0 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
2fb00 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61  xclusive-mode, a
2fb10 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72  nd there are cur
2fb20 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e  rently.**      n
2fb30 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2fb40 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20  ferences to any 
2fb50 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e  pages, and is in
2fb60 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2fb70 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61  ,.**      then a
2fb80 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
2fb90 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65  e to clear the e
2fba0 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69  rror state by di
2fbb0 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20  scarding.**     
2fbc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2fbd0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
2fbe0 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  and rolling back
2fbf0 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   any open journa
2fc00 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a  l.**      file..
2fc10 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
2fc20 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2fc30 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
2fc40 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2fc50 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
2fc60 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
2fc70 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
2fc80 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
2fc90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2fca0 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62  or .** rolling b
2fcb0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
2fcc0 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
2fcd0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2fce0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2fcf0 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
2fd00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2fd10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2fd20 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2fd30 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2fd40 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
2fd50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2fd60 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
2fd70 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
2fd80 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2fd90 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
2fda0 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
2fdb0 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
2fdc0 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
2fdd0 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
2fde0 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
2fdf0 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
2fe00 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
2fe10 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
2fe20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
2fe30 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
2fe40 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
2fe50 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
2fe60 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2fe70 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ache)==0 );.  as
2fe80 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2fe90 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2fea0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2feb0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2fec0 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
2fed0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2fee0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66  R_READER );.  if
2fef0 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26  ( NEVER(MEMDB &&
2ff00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2ff10 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67  ) ){ return pPag
2ff20 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a  er->errCode; }..
2ff30 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
2ff40 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
2ff50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2ff60 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
2ff70 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
2ff80 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
2ff90 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
2ffa0 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
2ffb0 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
2ffc0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2ffd0 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  );..    rc = pag
2ffe0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
2fff0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
30000 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
30010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30020 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
30030 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
30040 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
30050 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
30060 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  CK );.      goto
30070 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a   failed;.    }..
30080 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
30090 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
300a0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
300b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
300c0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
300d0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
300e0 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
300f0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
30100 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
30110 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
30120 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41  ager->eLock<=SHA
30130 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
30140 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
30150 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48  rnal(pPager, &bH
30160 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
30170 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
30180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30190 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
301a0 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74    }.    if( bHot
301b0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
301c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
301d0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
301e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
301f0 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  DONLY_ROLLBACK;.
30200 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
30210 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
30220 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
30230 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
30240 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30250 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
30260 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
30270 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
30280 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
30290 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
302a0 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
302b0 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
302c0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
302d0 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
302e0 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
302f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
30300 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
30310 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
30320 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
30330 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
30340 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
30350 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
30360 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
30370 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
30380 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
30390 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
303a0 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
303b0 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
303c0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
303d0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
303e0 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
303f0 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
30400 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
30410 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
30420 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30430 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
30440 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
30450 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
30460 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
30470 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
30480 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
30490 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
304a0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  e file..      **
304b0 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73  .      ** Unless
304c0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
304d0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
304e0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
304f0 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20  e lock is.      
30500 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
30510 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66   SHARED_LOCK bef
30520 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
30530 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20  n returns..     
30540 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
30550 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
30560 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
30570 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
30580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30590 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
305a0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  ed;.      }. .  
305b0 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
305c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
305d0 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78   and the file ex
305e0 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70  ists on disk, op
305f0 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
30600 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
30610 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
30620 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20  Write access is 
30630 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
30640 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78   .      ** in ex
30650 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
30660 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
30670 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
30680 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20  kept open .     
30690 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79   ** and possibly
306a0 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
306b0 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
306c0 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63  . Also, write-ac
306d0 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  cess .      ** i
306e0 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72  s usually requir
306f0 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ed to finalize t
30700 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f  he journal in jo
30710 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69  urnal_mode=persi
30720 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  st .      ** mod
30730 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20  e (and also for 
30740 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75  journal_mode=tru
30750 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79  ncate on some sy
30760 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a  stems)..      **
30770 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
30780 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
30790 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61  t exist, it usua
307a0 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73  lly means that s
307b0 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74  ome .      ** ot
307c0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
307d0 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
307e0 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
307f0 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
30800 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ** this connecti
30810 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  on obtained the 
30820 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61  exclusive lock a
30830 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20  bove. Or, it .  
30840 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
30850 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
30860 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
30870 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
30880 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
30890 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64  n was called and
308a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
308b0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
308c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
308d0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
308e0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
308f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
30900 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
30910 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
30920 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74        int bExist
30930 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
30940 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
30950 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  al file exists *
30960 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
30970 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
30980 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
30990 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
309a0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
309b0 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73  S_EXISTS, &bExis
309c0 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ts);.        if(
309d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
309e0 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20  & bExists ){.   
309f0 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
30a00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
30a10 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
30a20 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
30a30 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
30a40 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
30a50 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
30a60 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
30a70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30a80 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
30a90 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
30aa0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
30ab0 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
30ac0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
30ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
30ae0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
30af0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
30b00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30b10 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
30b20 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
30b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30b40 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
30b50 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
30b60 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
30b70 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
30b80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30b90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30ba0 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
30bb0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
30bc0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
30bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
30be0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
30bf0 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
30c00 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
30c10 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
30c20 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
30c30 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
30c40 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
30c50 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
30c60 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
30c70 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
30c80 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74  t cache.  Sync t
30c90 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62  he hot journal b
30ca0 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20  efore playing.  
30cb0 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73      ** it back s
30cc0 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73  ince the process
30cd0 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e   that crashed an
30ce0 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a  d left the hot j
30cf0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
30d00 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74  probably did not
30d10 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20   sync it and we 
30d20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
30d30 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20  always sync.    
30d40 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
30d50 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20   before playing 
30d60 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  it back..      *
30d70 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
30d80 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
30d90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
30da0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
30db0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
30dc0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
30dd0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
30de0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30e00 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
30e10 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
30e20 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   1);.          p
30e30 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
30e40 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
30e50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
30e60 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
30e70 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
30e80 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c          pagerUnl
30e90 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
30ea0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
30eb0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
30ec0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30ed0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
30ee0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
30ef0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
30f00 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
30f10 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  to open.        
30f20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20  ** or roll back 
30f30 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68  a hot-journal wh
30f40 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ile holding an E
30f50 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
30f60 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
30f70 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75  ger_unlock() rou
30f80 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
30f90 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  led before retur
30fa0 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20  ning to unlock. 
30fb0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69         ** the fi
30fc0 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63  le. If the unloc
30fd0 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c  k attempt fails,
30fe0 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63   then Pager.eLoc
30ff0 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20  k must be.      
31000 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e    ** set to UNKN
31010 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68  OWN_LOCK (see th
31020 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
31030 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20  the #define for 
31040 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e  .        ** UNKN
31050 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66  OWN_LOCK above f
31060 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
31070 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  n). .        **.
31080 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72          ** In or
31090 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72  der to get pager
310a0 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20  _unlock() to do 
310b0 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e  this, set Pager.
310c0 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20  eState to.      
310d0 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
310e0 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f   now. This is no
310f0 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74  t actually count
31100 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69  ed as a transiti
31110 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  on.        ** to
31120 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20   ERROR state in 
31130 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61  the state diagra
31140 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  m at the top of 
31150 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20  this file,.     
31160 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
31170 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d  now that the sam
31180 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
31190 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65  unlock() will ve
311a0 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68  ry.        ** sh
311b0 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e  ortly transition
311c0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
311d0 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74  t to the OPEN st
311e0 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20  ate. Calling.   
311f0 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70       ** assert_p
31200 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75  ager_state() wou
31210 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20  ld fail now, as 
31220 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
31230 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
31240 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52    ** to be in ER
31250 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
31260 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75  here are zero ou
31270 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a  tstanding page .
31280 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72          ** refer
31290 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ences..        *
312a0 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  /.        pager_
312b0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
312c0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
312d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
312e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
312f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
31300 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
31310 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
31320 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  er->eLock==SHARE
31330 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20  D_LOCK).        
31340 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
31350 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
31360 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48  pPager->eLock>SH
31370 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
31380 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
31390 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
313a0 46 69 6c 65 20 26 26 20 28 0a 20 20 20 20 20 20  File && (.      
313b0 20 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75    pPager->pBacku
313c0 70 20 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  p .     || sqlit
313d0 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
313e0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
313f0 65 29 3e 30 20 0a 20 20 20 20 20 7c 7c 20 70 50  e)>0 .     || pP
31400 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 0a  ager->bUseFetch.
31410 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 2f 2a      )){.      /*
31420 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
31430 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
31440 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
31450 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
31460 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
31470 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
31480 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
31490 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
314a0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
314b0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
314c0 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
314d0 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
314e0 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
314f0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
31500 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
31510 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
31520 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
31530 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
31540 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
31550 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
31560 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
31570 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
31580 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
31590 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
315a0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
315b0 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
315c0 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
315d0 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
315e0 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
315f0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
31600 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
31610 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
31620 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
31630 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
31640 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
31650 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
31660 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
31670 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
31680 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
31690 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
316a0 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
316b0 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
316c0 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
316d0 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
316e0 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
316f0 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
31700 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
31710 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
31720 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
31730 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
31740 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  e = 0;.      cha
31750 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
31760 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
31770 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20  leVers)];..     
31780 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
31790 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
317a0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
317b0 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64  rc ) goto failed
317c0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  ;..      if( nPa
317d0 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ge>0 ){.        
317e0 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
317f0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
31800 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
31810 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
31820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
31830 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
31840 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
31850 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
31860 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66   24);.        if
31870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31880 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
31890 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
318a0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
318b0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
318c0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
318d0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
318e0 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
318f0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
31900 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
31910 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
31920 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
31930 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
31940 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
31950 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
31960 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
31970 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  r);..        /* 
31980 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62 61  Unmap the databa
31990 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70  se file. It is p
319a0 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65 78 74  ossible that ext
319b0 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a  ernal processes.
319c0 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68          ** may h
319d0 61 76 65 20 74 72 75 6e 63 61 74 65 64 20 74 68  ave truncated th
319e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
319f0 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65  and then extende
31a00 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20  d it back.      
31a10 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67    ** to its orig
31a20 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20  inal size while 
31a30 74 68 69 73 20 70 72 6f 63 65 73 73 20 77 61 73  this process was
31a40 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c   not holding a l
31a50 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ock..        ** 
31a60 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
31a70 72 65 20 6d 61 79 20 65 78 69 73 74 20 61 20 50  re may exist a P
31a80 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e  ager.pMap mappin
31a90 67 20 74 68 61 74 20 61 70 70 65 61 72 73 0a 20  g that appears. 
31aa0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
31ab0 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 20 62  the right size b
31ac0 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  ut is not actual
31ad0 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20  ly valid. Avoid 
31ae0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
31af0 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20 75  possibility by u
31b00 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62 20  nmapping the db 
31b10 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
31b20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 62 55 73   if( pPager->bUs
31b30 65 46 65 74 63 68 20 29 7b 0a 20 20 20 20 20 20  eFetch ){.      
31b40 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
31b50 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
31b60 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
31b70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
31b80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
31b90 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
31ba0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
31bb0 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
31bc0 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
31bd0 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
31be0 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
31bf0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
31c00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
31c10 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
31c20 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
31c30 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e  nt(pPager);.#ifn
31c40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31c50 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20  WAL.    assert( 
31c60 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20  pPager->pWal==0 
31c70 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
31c80 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a   );.#endif.  }..
31c90 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
31ca0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
31cb0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
31cc0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
31cd0 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61   = pagerBeginRea
31ce0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
31cf0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
31d00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
31d10 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72  =PAGER_OPEN && r
31d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31d30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
31d40 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
31d50 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  &pPager->dbSize)
31d60 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
31d70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31d80 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
31d90 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
31da0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
31db0 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
31dc0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
31dd0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
31de0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
31df0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
31e00 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d  AGER_READER;.  }
31e10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31e20 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
31e30 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
31e40 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
31e50 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
31e60 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
31e70 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
31e80 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
31e90 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
31ea0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
31eb0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
31ec0 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
31ed0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
31ee0 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
31ef0 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
31f00 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
31f10 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
31f20 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
31f30 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
31f40 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
31f50 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
31f60 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
31f70 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71  ager){.  if( (sq
31f80 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
31f90 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
31fa0 63 68 65 29 3d 3d 30 29 20 26 26 20 70 50 61 67  che)==0) && pPag
31fb0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20  er->nMmapOut==0 
31fc0 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
31fd0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
31fe0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
31ff0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
32000 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
32010 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
32020 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
32030 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
32040 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
32050 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
32060 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
32070 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
32080 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
32090 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
320a0 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
320b0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
320c0 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
320d0 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
320e0 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
320f0 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
32100 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
32110 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
32120 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
32130 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
32140 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
32150 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
32160 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
32170 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
32180 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
32190 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
321a0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
321b0 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
321c0 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
321d0 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
321e0 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
321f0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
32200 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
32210 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
32220 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
32230 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
32240 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
32250 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
32260 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
32270 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
32280 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
32290 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
322a0 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
322b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
322c0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
322d0 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
322e0 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
322f0 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
32300 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
32310 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
32320 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
32330 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
32340 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
32350 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
32360 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
32370 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
32380 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
32390 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
323a0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
323b0 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
323c0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
323d0 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
323e0 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
323f0 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
32400 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
32410 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
32420 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
32430 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
32440 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
32450 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
32460 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
32470 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
32480 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
32490 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
324a0 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
324b0 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69  seperate scenari
324c0 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
324d0 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
324e0 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
324f0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
32500 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
32510 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
32520 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
32530 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
32540 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
32550 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
32560 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
32570 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
32580 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
32590 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
325a0 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
325b0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
325c0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
325d0 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
325e0 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
325f0 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
32600 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
32610 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
32620 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
32630 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
32640 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
32650 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
32660 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
32670 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
32680 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
32690 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
326a0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
326b0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
326c0 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
326d0 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
326e0 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
326f0 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
32700 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
32710 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
32720 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
32730 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
32740 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32750 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
32760 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
32770 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
32780 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
32790 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
327a0 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
327b0 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
327c0 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
327d0 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
327e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
327f0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
32800 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
32810 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
32820 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
32830 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
32840 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
32850 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
32860 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
32870 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
32880 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
32890 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
328a0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
328b0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
328c0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
328d0 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
328e0 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
328f0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
32900 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
32910 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
32920 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
32930 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
32940 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
32950 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
32960 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
32970 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
32980 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
32990 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
329a0 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
329b0 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
329c0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
329d0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
329e0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
329f0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
32a00 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
32a10 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
32a20 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
32a30 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
32a40 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
32a50 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
32a60 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
32a70 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
32a80 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
32a90 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
32aa0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
32ab0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
32ac0 20 20 20 2f 2a 20 50 41 47 45 52 5f 41 43 51 55     /* PAGER_ACQU
32ad0 49 52 45 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  IRE_XXX flags */
32ae0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
32af0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
32b00 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33  r *pPg = 0;.  u3
32b10 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20  2 iFrame = 0;   
32b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32b30 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66   Frame to read f
32b40 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  rom WAL file */.
32b50 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f    const int noCo
32b60 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26  ntent = (flags &
32b70 20 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f 4e   PAGER_ACQUIRE_N
32b80 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a  OCONTENT);..  /*
32b90 20 49 74 20 69 73 20 61 63 63 65 70 74 61 62 6c   It is acceptabl
32ba0 65 20 74 6f 20 75 73 65 20 61 20 72 65 61 64 2d  e to use a read-
32bb0 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67 65  only (mmap) page
32bc0 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65 78   for any page ex
32bd0 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20 31  cept.  ** page 1
32be0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
32bf0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
32c00 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41 43  n open or the AC
32c10 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20  QUIRE_READONLY. 
32c20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70 65   ** flag was spe
32c30 63 69 66 69 65 64 20 62 79 20 74 68 65 20 63 61  cified by the ca
32c40 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e  ller. And so lon
32c50 67 20 61 73 20 74 68 65 20 64 62 20 69 73 20 6e  g as the db is n
32c60 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  ot a .  ** tempo
32c70 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72  rary or in-memor
32c80 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  y database.  */.
32c90 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61    const int bMma
32ca0 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d 31 20 26  pOk = (pgno!=1 &
32cb0 26 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65  & pPager->bUseFe
32cc0 74 63 68 0a 20 20 20 26 26 20 28 70 50 61 67 65  tch.   && (pPage
32cd0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32ce0 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67  _READER || (flag
32cf0 73 20 26 20 50 41 47 45 52 5f 41 43 51 55 49 52  s & PAGER_ACQUIR
32d00 45 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29  E_READONLY)).  )
32d10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
32d20 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
32d30 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
32d40 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
32d50 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
32d60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
32d70 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62  oContent==0 || b
32d80 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20  MmapOk==0 );..  
32d90 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
32da0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32db0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
32dc0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
32dd0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
32de0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
32df0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
32e00 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
32e10 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
32e20 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
32e30 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
32e40 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
32e50 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
32e60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
32e70 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
32e80 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20  de;.  }else{..  
32e90 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
32ea0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
32eb0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
32ec0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
32ed0 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
32ee0 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
32ef0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
32f00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
32f10 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
32f20 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
32f30 20 20 69 66 28 20 69 46 72 61 6d 65 3d 3d 30 20    if( iFrame==0 
32f40 26 26 20 62 4d 6d 61 70 4f 6b 20 29 7b 0a 20 20  && bMmapOk ){.  
32f50 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
32f60 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  = 0;..      rc =
32f70 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28   sqlite3OsFetch(
32f80 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20  pPager->fd, .   
32f90 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e         (i64)(pgn
32fa0 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
32fb0 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
32fc0 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74  >pageSize, &pDat
32fd0 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  a.      );..    
32fe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32ff0 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a  _OK && pData ){.
33000 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
33010 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
33020 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20  _READER ){.     
33030 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
33040 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
33050 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
33060 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
33070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33080 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
33090 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
330a0 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
330b0 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
330c0 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20  pData, &pPg);.  
330d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
330e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
330f0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
33100 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31  fd, (i64)(pgno-1
33110 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  )*pPager->pageSi
33120 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
33130 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
33140 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20  ( pPg ){.       
33150 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
33160 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
33170 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
33180 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72  pPg;.          r
33190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
331a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
331b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
331c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
331d0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
331e0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
331f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
33200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
33210 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
33220 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
33230 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a  1, ppPage);.  }.
33240 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
33250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  E_OK ){.    /* E
33260 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
33270 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  o sqlite3PcacheF
33280 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20  etch() returned 
33290 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a  an error or the.
332a0 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73      ** pager was
332b0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
332c0 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
332d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
332e0 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
332f0 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61  * Set pPg to 0 a
33300 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  nd jump to the e
33310 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72  xception handler
33320 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  .  */.    pPg = 
33330 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  0;.    goto page
33340 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
33350 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
33360 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
33370 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
33380 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
33390 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70  r==pPager || (*p
333a0 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
333b0 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70  0 );..  if( (*pp
333c0 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26  Page)->pPager &&
333d0 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
333e0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
333f0 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
33400 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
33410 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
33420 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
33430 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
33440 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
33450 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
33460 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
33470 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
33480 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
33490 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50  Pager) );.    pP
334a0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
334b0 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20  R_STAT_HIT]++;. 
334c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
334d0 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
334e0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
334f0 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
33500 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
33510 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
33520 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
33530 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a  itialized.  */..
33540 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67      pPg = *ppPag
33550 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  e;.    pPg->pPag
33560 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
33570 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
33580 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
33590 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
335a0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
335b0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d   page.    ** num
335c0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
335d0 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e   this, or the un
335e0 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67  used locking-pag
335f0 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  e, is requested.
33600 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
33610 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
33620 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
33630 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
33640 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
33650 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
33660 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
33670 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
33680 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d      }..    if( M
33690 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e  EMDB || pPager->
336a0 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e  dbSize<pgno || n
336b0 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f  oContent || !isO
336c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
336d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
336e0 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
336f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
33700 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
33710 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
33720 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
33730 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
33740 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
33750 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
33760 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
33770 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
33780 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
33790 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
337a0 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
337b0 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
337c0 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
337d0 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
337e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
337f0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
33800 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
33810 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
33820 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
33830 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
33840 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
33850 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
33860 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
33870 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
33880 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
33890 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
338a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
338b0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
338c0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
338d0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
338e0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
338f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
33900 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
33910 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
33920 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
33930 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
33940 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
33950 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
33960 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
33970 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
33980 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
33990 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
339a0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
339b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
339c0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
339d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
339e0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
339f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33a00 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
33a10 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
33a20 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
33a30 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
33a40 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
33a50 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
33a60 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61  se{.      if( pa
33a70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
33a80 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20  ) && bMmapOk==0 
33a90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
33aa0 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
33ab0 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
33ac0 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  , pgno, &iFrame)
33ad0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
33ae0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
33af0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
33b00 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
33b10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
33b20 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
33b30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
33b40 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
33b50 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20  T_MISS]++;.     
33b60 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
33b70 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
33b80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33ba0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
33bb0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
33bc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
33bd0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
33be0 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
33bf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
33c00 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
33c10 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
33c20 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
33c30 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
33c40 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
33c50 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
33c60 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
33c70 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
33c80 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
33c90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
33ca0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
33cb0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
33cc0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
33cd0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
33ce0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
33cf0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
33d00 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
33d10 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
33d20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
33d30 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
33d40 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
33d50 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
33d60 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
33d70 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
33d80 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
33d90 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
33da0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
33db0 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
33dc0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
33dd0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
33de0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
33df0 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
33e00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
33e10 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
33e20 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
33e30 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
33e40 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
33e50 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
33e60 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
33e70 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
33e80 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
33e90 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
33ea0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
33eb0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
33ec0 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
33ed0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
33ee0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33ef0 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
33f00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33f10 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
33f20 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d  EADER && pPager-
33f30 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
33f40 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  RROR );.  sqlite
33f50 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
33f60 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
33f70 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
33f80 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
33f90 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
33fa0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
33fb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
33fc0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
33fd0 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
33fe0 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
33ff0 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
34000 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
34010 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
34020 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
34030 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
34040 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
34050 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
34060 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
34070 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
34080 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
34090 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
340a0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
340b0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
340c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
340d0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
340e0 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20   if( pPg->flags 
340f0 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a  & PGHDR_MMAP ){.
34100 20 20 20 20 20 20 70 61 67 65 72 52 65 6c 65 61        pagerRelea
34110 73 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a  seMapPage(pPg);.
34120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34130 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
34140 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20  lease(pPg);.    
34150 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
34160 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
34170 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
34180 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
34190 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
341a0 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
341b0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
341c0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
341d0 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
341e0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
341f0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
34200 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
34210 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
34220 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
34230 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
34240 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
34250 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
34260 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
34270 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
34280 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
34290 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
342a0 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
342b0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
342c0 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
342d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
342e0 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
342f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
34300 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
34310 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
34320 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
34330 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
34340 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
34350 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
34360 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
34370 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
34380 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
34390 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
343a0 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
343b0 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
343c0 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
343d0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
343e0 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
343f0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
34400 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
34410 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
34420 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
34430 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
34440 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
34450 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
34460 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
34470 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
34480 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
34490 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
344a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
344b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
344c0 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
344d0 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
344e0 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
344f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
34500 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
34510 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
34520 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
34530 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
34540 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
34550 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
34560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
34570 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
34580 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
34590 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
345a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
345b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
345c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
345e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
345f0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
34600 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20   pPager->pVfs;  
34610 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
34620 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a  of vfs pointer *
34630 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
34640 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
34650 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
34660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
34670 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
34680 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
34690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
346a0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
346b0 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64   .  /* If alread
346c0 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
346d0 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
346e0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
346f0 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65   But on.  ** the
34700 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69   other hand, thi
34710 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
34720 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  er called if we 
34730 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
34740 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61   ** an error sta
34750 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  te. */.  if( NEV
34760 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
34770 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
34780 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
34790 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
347a0 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
347b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
347c0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
347d0 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70  ODE_OFF ){.    p
347e0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
347f0 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
34800 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
34810 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  dbSize);.    if(
34820 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
34830 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nal==0 ){.      
34840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
34850 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  MEM;.    }.  .  
34860 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
34870 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
34880 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
34890 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  open. */.    if(
348a0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
348b0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
348c0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
348d0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
348e0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
348f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
34900 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
34910 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
34920 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34930 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
34940 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
34950 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
34960 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
34970 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
34980 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
34990 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
349a0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
349b0 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61  |.          (pPa
349c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20  ger->tempFile ? 
349d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51  .            (SQ
349e0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
349f0 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
34a00 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
34a10 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ):.            (
34a20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
34a30 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20  _JOURNAL).      
34a40 20 20 20 20 29 3b 0a 20 20 23 69 66 64 65 66 20      );.  #ifdef 
34a50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
34a60 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
34a70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
34a80 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
34a90 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
34aa0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
34ab0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
34ac0 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
34ad0 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20  ze(pPager).     
34ae0 20 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a 20 20     );.  #else.  
34af0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34b00 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
34b10 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
34b20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
34b30 61 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69  ags, 0);.  #endi
34b40 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
34b50 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
34b60 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
34b70 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
34b80 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20      }.  .  .    
34b90 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72  /* Write the fir
34ba0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
34bb0 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r to the journal
34bc0 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a   file and open .
34bd0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
34be0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
34bf0 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ary..    */.    
34c00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34c10 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  K ){.      /* TO
34c20 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c  DO: Check if all
34c30 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65   of these are re
34c40 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a  ally required. *
34c50 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
34c60 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
34c70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
34c80 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
34c90 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
34ca0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
34cb0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
34cc0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  0;.      rc = wr
34cd0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
34ce0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
34cf0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
34d00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
34d10 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
34d20 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
34d30 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
34d40 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
34d50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
34d60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34d70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
34d80 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
34d90 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
34da0 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
34db0 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a  _CACHEMOD;.  }..
34dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34dd0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72  /*.** Begin a wr
34de0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
34df0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
34e00 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
34e10 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72  f a .** write-tr
34e20 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
34e30 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
34e40 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
34e50 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
34e60 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  ** If the exFlag
34e70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
34e80 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  se, then acquire
34e90 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
34ea0 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  RVED.** lock on 
34eb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34ec0 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  e. If exFlag is 
34ed0 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69  true, then acqui
34ee0 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61  re at least.** a
34ef0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
34f00 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
34f10 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
34f20 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  , no locking .**
34f30 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20   functions need 
34f40 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  be called..**.**
34f50 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
34f60 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
34f70 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
34f80 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
34f90 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
34fa0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
34fb0 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
34fc0 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
34fd0 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
34fe0 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
34ff0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
35000 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
35010 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
35020 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
35030 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
35040 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
35050 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
35060 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
35070 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
35080 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
35090 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
350a0 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
350b0 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
350c0 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
350d0 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
350e0 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
350f0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
35100 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
35110 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
35120 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
35130 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
35140 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
35150 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
35160 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
35170 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35180 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
35190 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
351a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
351b0 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  rCode;.  assert(
351c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
351d0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
351e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
351f0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
35200 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
35210 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a  emory = (u8)subj
35220 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28  InMemory;..  if(
35230 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
35240 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
35250 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73  ADER) ){.    ass
35260 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
35270 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20  Journal==0 );.. 
35280 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
35290 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
352a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
352b0 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ger is configure
352c0 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67  d to use locking
352d0 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c  _mode=exclusive,
352e0 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a   and an.      **
352f0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
35300 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35310 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  is not already h
35320 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e  eld, obtain it n
35330 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ow..      */.   
35340 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
35350 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
35360 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
35370 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
35380 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  pWal, -1) ){.   
35390 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
353a0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
353b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
353c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
353d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
353e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
353f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35400 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63     sqlite3WalExc
35410 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
35420 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20  r->pWal, 1);.   
35430 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
35440 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
35450 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
35460 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
35470 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
35480 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53      ** PAGER_RES
35490 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68  ERVED state. Oth
354a0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
354b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
354c0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
354d0 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61    ** The busy-ha
354e0 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76  ndler is not inv
354f0 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20  oked if another 
35500 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61  connection alrea
35510 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64  dy.      ** hold
35520 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  s the write-lock
35530 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
35540 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
35550 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20  ill call it..   
35560 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
35570 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
35580 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
35590 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
355a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
355b0 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
355c0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
355d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
355e0 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
355f0 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a  arameter.      *
35600 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
35610 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
35620 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
35630 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
35640 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79  he.      ** busy
35650 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
35660 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
35670 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
35680 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
35690 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
356a0 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
356b0 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
356c0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
356d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
356e0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
356f0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
35700 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
35710 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67  ITE_OK && exFlag
35720 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
35730 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
35740 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
35750 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
35760 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
35770 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35780 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  K ){.      /* Ch
35790 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c  ange to WRITER_L
357a0 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20  OCKED state..   
357b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
357c0 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67  AL mode sets Pag
357d0 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47  er.eState to PAG
357e0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
357f0 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20   or CACHEMOD.   
35800 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61     ** when it ha
35810 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  s an open transa
35820 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72  ction, but never
35830 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e   to DBMOD or FIN
35840 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20  ISHED..      ** 
35850 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
35860 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73 20  in those states 
35870 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
35880 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20   back savepoint 
35890 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
358a0 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20  ctions may copy 
358b0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75  data from the su
358c0 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  b-journal into t
358d0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
358e0 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65     ** file as we
358f0 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70  ll as into the p
35900 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63 68  age cache. Which
35910 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72   would be incorr
35920 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  ect in .      **
35930 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20   WAL mode..     
35940 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
35950 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
35960 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a  _WRITER_LOCKED;.
35970 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
35980 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
35990 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
359a0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
359b0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
359c0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
359d0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
359e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
359f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
35a00 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
35a10 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
35a20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35a30 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
35a40 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
35a50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
35a60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
35a70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35a80 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
35a90 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  KED );.    asser
35aa0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
35ab0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
35ac0 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
35ad0 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
35ae0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
35af0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74  pPager)));.  ret
35b00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
35b10 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
35b20 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
35b30 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
35b40 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
35b50 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
35b60 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
35b70 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
35b80 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
35b90 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
35ba0 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
35bb0 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
35bc0 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
35bd0 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
35be0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
35bf0 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
35c00 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
35c10 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
35c20 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
35c30 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
35c40 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
35c50 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
35c60 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
35c70 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
35c80 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
35c90 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
35ca0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
35cb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
35cc0 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  K;..  /* This ro
35cd0 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
35ce0 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69  led unless a wri
35cf0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
35d00 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a  as already .  **
35d10 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54   been started. T
35d20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35d30 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
35d40 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70  e open at this p
35d50 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73  oint..  ** It is
35d60 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
35d70 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
35d80 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
35d90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
35da0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
35db0 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
35dc0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35dd0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
35de0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
35df0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35e00 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
35e10 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
35e20 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
35e30 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
35e40 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
35e50 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f   has been previo
35e60 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20 72  usly detected, r
35e70 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65 20 65  eport the same e
35e80 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e  rror.  ** again.
35e90 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   This should not
35ea0 20 68 61 70 70 65 6e 2c 20 62 75 74 20 74 68 65   happen, but the
35eb0 20 63 68 65 63 6b 20 70 72 6f 76 69 64 65 73 20   check provides 
35ec0 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20  robustness. */. 
35ed0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
35ee0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72  r->errCode) )  r
35ef0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
35f00 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67  rCode;..  /* Hig
35f10 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her-level routin
35f20 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  es never call th
35f30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64  is function if d
35f40 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20  atabase is not. 
35f50 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42   ** writable.  B
35f60 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c  ut check anyway,
35f70 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74   just for robust
35f80 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  ness. */.  if( N
35f90 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61  EVER(pPager->rea
35fa0 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  dOnly) ) return 
35fb0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20  SQLITE_PERM;..  
35fc0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
35fd0 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e  ..  /* The journ
35fe0 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
35ff0 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68   be opened. High
36000 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er level routine
36010 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  s have already. 
36020 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65   ** obtained the
36030 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73   necessary locks
36040 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72   to begin the wr
36050 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
36060 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f   but the.  ** ro
36070 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
36080 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20  ight not yet be 
36090 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f  open. Open it no
360a0 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  w if this is the
360b0 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
360c0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
360d0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c  fore calling sql
360e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
360f0 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67  rty() on the pag
36100 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  e. .  ** Otherwi
36110 73 65 2c 20 69 66 20 69 74 20 77 65 72 65 20 64  se, if it were d
36120 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e  one after callin
36130 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  g sqlite3PcacheM
36140 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e  akeDirty(), then
36150 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d  .  ** an error m
36160 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74  ight occur and t
36170 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65  he pager would e
36180 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f  nd up in WRITER_
36190 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a  LOCKED state.  *
361a0 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d 61 72  * with pages mar
361b0 6b 65 64 20 61 73 20 64 69 72 74 79 20 69 6e 20  ked as dirty in 
361c0 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a  the cache..  */.
361d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
361e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
361f0 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
36200 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
36210 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
36220 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
36230 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
36240 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
36250 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36260 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
36270 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73  CACHEMOD );.  as
36280 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
36290 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
362a0 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74   );..  /* Mark t
362b0 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
362c0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
362d0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
362e0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
362f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
36300 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
36310 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
36320 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
36330 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
36340 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e   if( pageInJourn
36350 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a  al(pPg) && !subj
36360 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
36370 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
36380 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
36390 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65  ager) );.  }else
363a0 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  {.  .    /* The 
363b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
363c0 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
363d0 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
363e0 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
363f0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
36400 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
36410 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
36420 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
36430 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
36440 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
36450 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
36460 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
36470 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
36480 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  ( !pageInJournal
36490 28 70 50 67 29 20 26 26 20 21 70 61 67 65 72 55  (pPg) && !pagerU
364a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
364b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
364c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
364d0 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  r)==0 );.      i
364e0 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
364f0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
36500 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
36510 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
36520 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20     u32 cksum;.  
36530 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
36540 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  a2;.        i64 
36550 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  iOff = pPager->j
36560 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20  ournalOff;..    
36570 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
36580 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
36590 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
365a0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
365b0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
365c0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
365d0 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
365e0 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
365f0 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  ifies.        **
36600 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
36610 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
36620 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
36630 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
36640 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ger) );..       
36650 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36660 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61  >journalHdr<=pPa
36670 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
36680 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
36690 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
366a0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
366b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
366c0 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
366d0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
366e0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
366f0 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a   (u8*)pData2);..
36700 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20          /* Even 
36710 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b  if an IO or disk
36720 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  full error occur
36730 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  s while journall
36740 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20  ing the.        
36750 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
36760 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
36770 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
36780 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
36790 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  .        ** Othe
367a0 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
367b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
367c0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
367d0 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20  logic in.       
367e0 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65   ** playback_one
367f0 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69  _page() will thi
36800 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  nk that the page
36810 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
36820 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
36830 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
36840 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e   file. And if an
36850 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
36860 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
36870 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
36880 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
36890 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20  follow..        
368a0 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  */.        pPg->
368b0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
368c0 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20  EED_SYNC;..     
368d0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
368e0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
368f0 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   iOff, pPg->pgno
36900 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
36910 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
36920 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
36940 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
36950 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
36960 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66  r->pageSize, iOf
36970 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66  f+4);.        if
36980 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36990 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
369a0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
369b0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
369c0 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e  d, iOff+pPager->
369d0 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75  pageSize+4, cksu
369e0 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  m);.        if( 
369f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
36a00 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
36a10 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
36a20 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
36a30 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
36a40 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
36a50 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
36a60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
36a70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
36a80 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f  ;.        PAGER_
36a90 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
36aa0 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
36ab0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
36ac0 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE(("JOURNAL %
36ad0 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
36ae0 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
36af0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
36b00 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
36b10 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  ), pPg->pgno, . 
36b20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
36b30 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
36b40 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20  EED_SYNC)?1:0), 
36b50 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
36b60 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  Pg)));..        
36b70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
36b80 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72  ff += 8 + pPager
36b90 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
36ba0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
36bb0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
36bc0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
36bd0 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
36be0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36bf0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
36c00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
36c10 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
36c20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
36c30 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
36c40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
36c60 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
36c70 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  EM );.        rc
36c80 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69   |= addToSavepoi
36c90 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
36ca0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
36cb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
36ce0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
36cf0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
36d00 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
36d10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36d20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
36d30 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
36d40 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20  RITER_DBMOD ){. 
36d50 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
36d60 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
36d70 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
36d80 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
36d90 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64  RACE(("APPEND %d
36da0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
36db0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
36dc0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
36dd0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
36de0 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
36df0 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
36e00 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
36e10 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20  )?1:0)));.      
36e20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
36e30 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
36e40 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
36e50 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
36e60 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
36e70 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
36e80 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
36e90 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
36ea0 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
36eb0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
36ec0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
36ed0 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
36ee0 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
36ef0 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
36f00 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
36f10 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
36f20 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
36f30 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
36f40 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
36f50 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
36f60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
36f70 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
36f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
36f90 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
36fa0 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
36fb0 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
36fc0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
36fd0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
36fe0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
36ff0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d  = pPg->pgno;.  }
37000 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37010 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
37020 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
37030 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69  able. This routi
37040 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
37050 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b  d before .** mak
37060 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ing changes to a
37070 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65   page. The calle
37080 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  r must check the
37090 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a   return value .*
370a0 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  * of this functi
370b0 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  on and be carefu
370c0 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20  l not to change 
370d0 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
370e0 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f  less .** this ro
370f0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
37100 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
37110 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
37120 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
37130 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
37140 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
37150 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
37160 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
37170 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
37180 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
37190 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
371a0 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
371b0 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
371c0 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
371d0 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
371e0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
371f0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
37200 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
37210 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
37220 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
37230 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
37240 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
37250 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
37260 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ** as appropriat
37270 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
37280 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
37290 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
372a0 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
372b0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
372c0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
372d0 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
372e0 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
372f0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
37300 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
37310 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
37320 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
37330 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
37340 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67  ..  assert( (pPg
37350 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
37360 4d 4d 41 50 29 3d 3d 30 20 29 3b 0a 20 20 61 73  MMAP)==0 );.  as
37370 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
37380 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
37390 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
373a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
373b0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
373c0 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
373d0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
373e0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
373f0 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63   if( nPagePerSec
37400 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
37410 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
37420 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
37430 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
37440 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
37450 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
37460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37470 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
37480 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
37490 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
374a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
374b0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
374c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
374d0 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
374e0 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
374f0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
37500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37510 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
37520 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
37530 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
37540 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
37550 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f   page has PGHDR_
37560 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20  NEED_SYNC */..  
37570 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
37580 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67  otSyncSpill flag
37590 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
375a0 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
375b0 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20   allow.    ** a 
375c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
375d0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
375e0 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
375f0 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20 20 20 20  ournaled by.    
37600 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
37610 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
37620 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
37630 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
37640 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
37650 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l==0 );.    pPag
37660 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
37670 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ll++;..    /* Th
37680 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
37690 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
376a0 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
376b0 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
376c0 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
376d0 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
376e0 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
376f0 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
37700 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
37710 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
37720 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
37730 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
37740 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
37750 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
37760 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
37770 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61  )) + 1;..    nPa
37780 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72  geCount = pPager
37790 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66  ->dbSize;.    if
377a0 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
377b0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
377c0 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67  nPage = (pPg->pg
377d0 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20  no - pg1)+1;.   
377e0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
377f0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
37800 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
37810 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
37820 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a  ageCount+1-pg1;.
37830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37840 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65   nPage = nPagePe
37850 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20  rSector;.    }. 
37860 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e     assert(nPage>
37870 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  0);.    assert(p
37880 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
37890 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b      assert((pg1+
378a0 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f  nPage)>pPg->pgno
378b0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  );..    for(ii=0
378c0 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63  ; ii<nPage && rc
378d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
378e0 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  +){.      Pgno p
378f0 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20  g = pg1+ii;.    
37900 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
37910 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50        if( pg==pP
37920 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69  g->pgno || !sqli
37930 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
37940 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37950 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20  , pg) ){.       
37960 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
37970 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
37980 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
37990 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
379a0 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
379b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
379c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
379d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
379e0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
379f0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
37a00 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
37a10 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
37a20 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
37a30 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
37a40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
37a50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
37a60 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
37a70 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
37a80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
37a90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
37aa0 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  (pPage = pager_l
37ab0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
37ac0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
37ad0 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
37ae0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
37af0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  C ){.          n
37b00 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
37b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
37b20 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
37b30 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
37b40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
37b50 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  f the PGHDR_NEED
37b60 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65  _SYNC flag is se
37b70 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
37b80 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
37b90 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
37ba0 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
37bb0 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
37bc0 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
37bd0 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
37be0 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
37bf0 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
37c00 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
37c10 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
37c20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
37c30 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
37c40 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
37c50 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
37c60 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
37c70 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
37c80 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
37c90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
37ca0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
37cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
37cc0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
37cd0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
37ce0 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69   );.      for(ii
37cf0 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69  =0; ii<nPage; ii
37d00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  ++){.        PgH
37d10 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65  dr *pPage = page
37d20 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
37d30 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20   pg1+ii);.      
37d40 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
37d50 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
37d60 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
37d70 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
37d80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
37d90 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
37da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37db0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
37dc0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
37dd0 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a  SyncSpill==1 );.
37de0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
37df0 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20  tSyncSpill--;.  
37e00 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
37e10 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
37e20 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
37e30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37e40 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
37e50 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
37e60 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
37e70 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
37e80 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
37e90 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
37ea0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
37eb0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
37ec0 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
37ed0 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
37ee0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
37ef0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
37f00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
37f10 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
37f20 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
37f30 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  rn pPg->flags&PG
37f40 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e  HDR_DIRTY;.}.#en
37f50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
37f60 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
37f70 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
37f80 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
37f90 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
37fa0 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
37fb0 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70  mation on page p
37fc0 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  Pg back to the d
37fd0 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
37fe0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
37ff0 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
38000 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61   dirty.  This ha
38010 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
38020 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  le, when.** the 
38030 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64  page has been ad
38040 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66  ded as a leaf of
38050 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
38060 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  d so its.** cont
38070 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61  ent no longer ma
38080 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tters..**.** The
38090 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
380a0 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
380b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
380c0 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
380d0 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
380e0 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
380f0 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b  . The pager mark
38100 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
38110 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
38120 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
38130 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
38140 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
38150 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
38160 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64  ization can quad
38170 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
38180 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c  of large .** DEL
38190 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ETE operations..
381a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
381b0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67  agerDontWrite(Pg
381c0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
381d0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
381e0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
381f0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
38200 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67  R_DIRTY) && pPag
38210 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
38220 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  0 ){.    PAGERTR
38230 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
38240 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
38250 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
38260 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
38270 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43  .    IOTRACE(("C
38280 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
38290 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
382a0 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  )).    pPg->flag
382b0 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
382c0 57 52 49 54 45 3b 0a 20 20 20 20 70 61 67 65 72  WRITE;.    pager
382d0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
382e0 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
382f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
38300 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
38310 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ment the value o
38320 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
38330 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63  ile .** change-c
38340 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61  ounter, stored a
38350 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65  s a 4-byte big-e
38360 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74  ndian integer st
38370 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79  arting at .** by
38380 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20  te offset 24 of 
38390 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 20  the pager file. 
383a0 20 54 68 65 20 73 65 63 6f 6e 64 61 72 79 20 63   The secondary c
383b0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 74  hange counter at
383c0 0a 2a 2a 20 39 32 20 69 73 20 61 6c 73 6f 20 75  .** 92 is also u
383d0 70 64 61 74 65 64 2c 20 61 73 20 69 73 20 74 68  pdated, as is th
383e0 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
383f0 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65   number at offse
38400 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20  t 96..**.** But 
38410 74 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  this only happen
38420 73 20 69 66 20 74 68 65 20 70 50 61 67 65 72 2d  s if the pPager-
38430 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
38440 20 66 6c 61 67 20 69 73 20 66 61 6c 73 65 2e 0a   flag is false..
38450 2a 2a 20 54 6f 20 61 76 6f 69 64 20 65 78 63 65  ** To avoid exce
38460 73 73 20 63 68 75 72 6e 69 6e 67 20 6f 66 20 70  ss churning of p
38470 61 67 65 20 31 2c 20 74 68 65 20 75 70 64 61 74  age 1, the updat
38480 65 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f  e only happens o
38490 6e 63 65 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  nce..** See also
384a0 20 74 68 65 20 70 61 67 65 72 5f 77 72 69 74 65   the pager_write
384b0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
384c0 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f   routine that do
384d0 65 73 20 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64  es an .** uncond
384e0 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f  itional update o
384f0 66 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  f the change cou
38500 6e 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nters..**.** If 
38510 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  the isDirectMode
38520 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74   flag is zero, t
38530 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65  hen this is done
38540 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20   by calling .** 
38550 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
38560 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74  e() on page 1, t
38570 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  hen modifying th
38580 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
38590 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20  e.** page data. 
385a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
385b0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70   file will be up
385c0 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63  dated when the c
385d0 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
385e0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
385f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
38600 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20  DirectMode flag 
38610 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d  may only be non-
38620 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72  zero if the libr
38630 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ary was compiled
38640 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c  .** with the SQL
38650 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
38660 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65  C_WRITE macro de
38670 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  fined. In this c
38680 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72  ase,.** if isDir
38690 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ect is non-zero,
386a0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
386b0 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74  se file is updat
386c0 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62  ed directly.** b
386d0 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64  y writing an upd
386e0 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
386f0 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63  page 1 using a c
38700 61 6c 6c 20 74 6f