/ Hex Artifact Content
Login

Artifact e26184d451207542d56bd09b84339252a194791e:


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 4d 6d 61 70 46 72 65 65 6c 69 73 74  r *pMmapFreelist
7d40: 3b 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 61 73 73 65 72 74 28 20 70 61  g;..  assert( pa
1da20 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1da30 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c  ) );.  pPg = sql
1da40 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1da50 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
1da60 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
1da70 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
1da80 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
1da90 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
1daa0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1dab0 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
1dac0 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d  .      u32 iFram
1dad0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
1dae0 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
1daf0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1db00 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26  al, pPg->pgno, &
1db10 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
1db20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1db40 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
1db50 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
1db60 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1db70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1db80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1db90 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1dba0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1dbb0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1dbc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1dbd0 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  /* Normally, if 
1dbe0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1dbf0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e   rolled back, an
1dc00 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  y backup process
1dc10 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61  es are.  ** upda
1dc20 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63  ted as data is c
1dc30 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
1dc40 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1dc50 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20  l and into the. 
1dc60 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
1dc70 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61  is is not genera
1dc80 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74  lly possible wit
1dc90 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  h a WAL database
1dca0 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  , as.  ** rollba
1dcb0 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70  ck involves simp
1dcc0 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ly truncating th
1dcd0 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72  e log file. Ther
1dce0 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20  efore, if one.  
1dcf0 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65  ** or more frame
1dd00 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
1dd10 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1dd20 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72  he log (and ther
1dd30 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f  efore .  ** also
1dd40 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
1dd50 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65   backup database
1dd60 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  s) as part of th
1dd70 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  is transaction,.
1dd80 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73    ** the backups
1dd90 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74   must be restart
1dda0 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
1ddb0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
1ddc0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
1ddd0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1dde0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ddf0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1de00 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74   to rollback a t
1de10 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
1de20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  WAL database..*/
1de30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1de40 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67  rRollbackWal(Pag
1de50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1de60 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1de80 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
1de90 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b  .  PgHdr *pList;
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1deb0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69     /* List of di
1dec0 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76  rty pages to rev
1ded0 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72  ert */..  /* For
1dee0 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
1def0 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65  e cache that are
1df00 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
1df10 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79   or have already
1df20 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  .  ** been writt
1df30 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d  en (but not comm
1df40 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f  itted) to the lo
1df50 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f  g file, do one o
1df60 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c  f the .  ** foll
1df70 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
1df80 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65     + Discard the
1df90 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66   cached page (if
1dfa0 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f   refcount==0), o
1dfb0 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61  r.  **   + Reloa
1dfc0 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66  d page content f
1dfd0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1dfe0 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29   (if refcount>0)
1dff0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1e000 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1e010 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
1e020 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55  rc = sqlite3WalU
1e030 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
1e040 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  , pagerUndoCallb
1e050 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  ack, (void *)pPa
1e060 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ger);.  pList = 
1e070 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1e080 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1e090 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65  PCache);.  while
1e0a0 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53  ( pList && rc==S
1e0b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e0c0 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
1e0d0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1e0e0 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
1e0f0 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a  Callback((void *
1e100 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  )pPager, pList->
1e110 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74  pgno);.    pList
1e120 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
1e130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e140 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e150 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20  on is a wrapper 
1e160 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61  around sqlite3Wa
1e170 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65  lFrames(). As we
1e180 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a  ll as logging.**
1e190 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1e1a0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
1e1b0 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69  es headed by pLi
1e1c0 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  st (connected by
1e1d0 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69   pDirty),.** thi
1e1e0 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66  s function notif
1e1f0 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62  ies any active b
1e200 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1e210 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68  that the pages h
1e220 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20  ave.** changed. 
1e230 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20  .**.** The list 
1e240 6f 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20  of pages passed 
1e250 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  into this routin
1e260 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74  e is always sort
1e270 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ed by page numbe
1e280 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20  r..** Hence, if 
1e290 70 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61  page 1 appears a
1e2a0 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c  nywhere on the l
1e2b0 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ist, it will be 
1e2c0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a  the first page..
1e2d0 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
1e2e0 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
1e2f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e310 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1e320 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1e330 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1e340 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1e350 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
1e360 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
1e370 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1e380 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e390 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
1e3a0 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
1e3b0 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e3d0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
1e3e0 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20   commit */.){.  
1e3f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e410 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1e420 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20  /.  int nList;  
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e450 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20   pages in pList 
1e460 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1e470 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1e480 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
1e490 48 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67  HECK_PAGES).  Pg
1e4a0 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e4c0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1e4d0 72 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69  r pages */.#endi
1e4e0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
1e4f0 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61  ger->pWal );.  a
1e500 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1e510 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e520 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
1e530 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69  that the page li
1e540 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69  st is in accendi
1e550 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f  ng order */.  fo
1e560 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20  r(p=pList; p && 
1e570 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e  p->pDirty; p=p->
1e580 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73  pDirty){.    ass
1e590 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70  ert( p->pgno < p
1e5a0 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29  ->pDirty->pgno )
1e5b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1e5c0 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70  assert( pList->p
1e5d0 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f  Dirty==0 || isCo
1e5e0 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73  mmit );.  if( is
1e5f0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  Commit ){.    /*
1e600 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61   If a WAL transa
1e610 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
1e620 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20  ommitted, there 
1e630 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77  is no point in w
1e640 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  riting.    ** an
1e650 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  y pages with pag
1e660 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
1e670 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65  r than nTruncate
1e680 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69   into the WAL fi
1e690 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20  le..    ** They 
1e6a0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65  will never be re
1e6b0 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  ad by any client
1e6c0 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d  . So remove them
1e6d0 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79   from the pDirty
1e6e0 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72  .    ** list her
1e6f0 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20  e. */.    PgHdr 
1e700 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a  *p;.    PgHdr **
1e710 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b  ppNext = &pList;
1e720 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a  .    nList = 0;.
1e730 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1e740 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d   (*ppNext = p)!=
1e750 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  0; p=p->pDirty){
1e760 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67  .      if( p->pg
1e770 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b  no<=nTruncate ){
1e780 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20  .        ppNext 
1e790 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = &p->pDirty;.  
1e7a0 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20        nList++;. 
1e7b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e7c0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29   assert( pList )
1e7d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1e7e0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  List = 1;.  }.  
1e7f0 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
1e800 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20  GER_STAT_WRITE] 
1e810 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28  += nList;..  if(
1e820 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
1e830 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  ) pager_write_ch
1e840 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73  angecounter(pLis
1e850 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  t);.  rc = sqlit
1e860 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  e3WalFrames(pPag
1e870 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20  er->pWal, .     
1e880 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1e890 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63  e, pList, nTrunc
1e8a0 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70  ate, isCommit, p
1e8b0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
1e8c0 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ags.  );.  if( r
1e8d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e8e0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
1e8f0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1e900 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1e910 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1e920 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e930 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
1e940 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
1e950 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
1e960 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
1e970 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1e980 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70  _CHECK_PAGES.  p
1e990 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1e9a0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1e9b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1e9c0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1e9d0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e9e0 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
1e9f0 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23  gehash(p);.  }.#
1ea00 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1ea10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1ea20 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1ea30 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1ea40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ea50 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1ea60 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1ea70 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1ea80 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1ea90 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1eaa0 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1eab0 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1eac0 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1ead0 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1eae0 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1eaf0 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1eb00 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1eb10 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1eb20 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1eb30 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1eb40 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1eb50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1eb60 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1eb70 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1eb80 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1eb90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1eba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ebb0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1ebc0 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ebe0 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1ebf0 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1ec00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1ec10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1ec20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1ec30 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1ec40 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
1ec50 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1ec60 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
1ec70 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1ec80 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1ec90 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1eca0 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1ecb0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1ecc0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1ecd0 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1ece0 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1ecf0 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1ed00 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1ed10 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1ed20 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1ed30 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1ed40 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1ed50 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1ed60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1ed70 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1ed80 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1ed90 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1eda0 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1edb0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1edc0 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1edd0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ede0 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20  E_OK || changed 
1edf0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1ee00 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1ee10 69 66 28 20 70 50 61 67 65 72 2d 3e 62 55 73 65  if( pPager->bUse
1ee20 46 65 74 63 68 20 29 20 73 71 6c 69 74 65 33 4f  Fetch ) sqlite3O
1ee30 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
1ee40 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  >fd, 0, 0);.  }.
1ee50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ee60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1ee70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1ee80 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
1ee90 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   the transition 
1eea0 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a  from PAGER_OPEN.
1eeb0 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  ** to PAGER_READ
1eec0 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65  ER state to dete
1eed0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f  rmine the size o
1eee0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1eef0 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ile.** in pages 
1ef00 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61  (assuming the pa
1ef10 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c  ge size currentl
1ef20 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  y stored in Page
1ef30 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a  r.pageSize)..**.
1ef40 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
1ef50 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
1ef60 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1ef70 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1ef80 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
1ef90 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20  pages is stored 
1efa0 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65  in *pnPage. Othe
1efb0 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
1efc0 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a  code (perhaps.**
1efd0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1efe0 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64  TAT) is returned
1eff0 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1f000 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e  left unmodified.
1f010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f020 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
1f030 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1f040 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  o *pnPage){.  Pg
1f050 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f070 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1f080 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
1f090 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
1f0a0 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66  WAL sub-system f
1f0b0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1f0c0 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73  size. The WalDbs
1f0d0 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74  ize().  ** funct
1f0e0 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
1f0f0 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
1f100 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61  ot open (i.e. Pa
1f110 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72  ger.pWal==0), or
1f120 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74  .  ** if the dat
1f130 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1f140 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  t available. The
1f150 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1f160 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c  s not.  ** avail
1f170 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
1f180 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20  L sub-system if 
1f190 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
1f1a0 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f  empty or.  ** co
1f1b0 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20  ntains no valid 
1f1c0 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
1f1d0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ctions..  */.  a
1f1e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f1f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1f200 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1f210 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1f220 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e  ARED_LOCK );.  n
1f230 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61  Page = sqlite3Wa
1f240 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  lDbsize(pPager->
1f250 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  pWal);..  /* If 
1f260 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1f270 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61  e was not availa
1f280 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1f290 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a   sub-system,.  *
1f2a0 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62  * determine it b
1f2b0 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65  ased on the size
1f2c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f2d0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69   file. If the si
1f2e0 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64  ze.  ** of the d
1f2f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1f300 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d  not an integer m
1f310 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70  ultiple of the p
1f320 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72  age-size,.  ** r
1f330 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65  ound down to the
1f340 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 45   nearest page. E
1f350 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20  xcept, any file 
1f360 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20  larger than 0.  
1f370 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
1f380 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
1f390 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61  o contain at lea
1f3a0 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a  st one page..  *
1f3b0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
1f3c0 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   ){.    i64 n = 
1f3d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f3e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1f3f0 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65   db file in byte
1f400 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
1f410 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1f420 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1f430 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1f440 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1f450 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
1f460 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
1f470 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1f480 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20  ->fd, &n);.     
1f490 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f4a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1f4b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f4c0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
1f4d0 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61   = (Pgno)((n+pPa
1f4e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  ger->pageSize-1)
1f4f0 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1f500 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
1f510 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
1f520 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1f530 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
1f540 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
1f550 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
1f560 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
1f570 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
1f580 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
1f590 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
1f5a0 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
1f5b0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
1f5c0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
1f5d0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1f5e0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
1f5f0 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
1f600 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
1f610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f620 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
1f630 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1f640 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
1f650 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
1f660 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1f670 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
1f680 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
1f690 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
1f6a0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1f6b0 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
1f6c0 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
1f6d0 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
1f6e0 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
1f6f0 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
1f700 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
1f710 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
1f720 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1f730 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
1f740 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
1f750 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
1f760 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
1f770 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
1f780 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
1f790 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
1f7a0 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
1f7b0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1f7c0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
1f7d0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
1f7e0 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
1f7f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1f800 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
1f810 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
1f820 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1f830 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1f840 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
1f850 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
1f860 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1f870 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
1f880 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
1f890 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1f8a0 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
1f8b0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
1f8c0 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
1f8d0 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
1f8e0 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
1f8f0 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
1f900 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
1f910 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
1f920 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
1f930 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
1f940 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
1f950 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
1f960 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
1f970 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f980 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
1f990 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
1f9a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1f9b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
1f9c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f9d0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f9e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f9f0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1fa00 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  ED_LOCK );..  if
1fa10 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
1fa20 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
1fa30 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
1fa40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1fa50 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
1fa60 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  sts */.    Pgno 
1fa70 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1fa80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1fa90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1faa0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63   file */..    rc
1fab0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
1fac0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
1fad0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1fae0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
1faf0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
1fb00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fb10 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
1fb20 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
1fb30 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zWal, 0);.      
1fb40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1fb50 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
1fb60 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
1fb70 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  OK;.      isWal 
1fb80 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1fb90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fba0 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
1fbb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
1fbc0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
1fbd0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1fbe0 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
1fbf0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
1fc00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fc10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1fc20 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
1fc30 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1fc40 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
1fc50 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
1fc60 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
1fc70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1fc80 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
1fc90 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, 0);.      }el
1fca0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1fcb0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1fcc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
1fcd0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
1fce0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1fcf0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
1fd00 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
1fd10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1fd20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1fd30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
1fd40 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
1fd50 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
1fd60 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
1fd70 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
1fd80 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
1fd90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1fda0 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
1fdb0 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
1fdc0 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
1fdd0 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
1fde0 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
1fdf0 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
1fe00 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
1fe10 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
1fe20 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
1fe30 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
1fe40 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
1fe50 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
1fe60 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
1fe70 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
1fe80 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
1fe90 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
1fea0 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
1feb0 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
1fec0 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
1fed0 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
1fee0 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
1fef0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
1ff00 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
1ff10 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
1ff20 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
1ff30 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1ff40 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
1ff50 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
1ff60 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
1ff70 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
1ff80 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1ff90 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
1ffa0 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
1ffb0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1ffc0 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
1ffd0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
1ffe0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1fff0 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
20000 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
20010 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
20020 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
20030 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
20040 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
20050 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
20060 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
20070 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20080 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
20090 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
200a0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
200b0 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
200c0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
200d0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
200e0 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
200f0 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
20100 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
20110 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
20120 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
20130 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
20140 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
20150 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
20160 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
20170 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
20180 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
20190 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
201a0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
201b0 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
201c0 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
201d0 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
201e0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
201f0 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
20200 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
20210 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
20220 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
20230 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
20240 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
20250 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
20260 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
20270 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
20280 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
20290 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
202a0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
202b0 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
202c0 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
202d0 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
202e0 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
202f0 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
20300 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
20310 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
20320 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
20330 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
20340 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
20350 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
20360 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
20370 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
20380 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
20390 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
203a0 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
203b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
203c0 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
203d0 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
203e0 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
203f0 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
20400 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
20410 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
20420 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
20430 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
20440 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
20450 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
20460 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
20470 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
20480 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
20490 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
204a0 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
204b0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
204c0 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
204d0 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
204e0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
204f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
20500 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
20510 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
20520 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
20530 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
20540 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
20550 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
20560 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
20570 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
20580 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
20590 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
205a0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
205b0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
205c0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
205d0 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
205e0 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
205f0 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
20600 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
20610 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
20620 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
20630 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
20640 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
20650 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
20660 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
20670 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
20680 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
20690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
206a0 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
206b0 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
206c0 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
206d0 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
206e0 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
206f0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
20700 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
20710 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
20720 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
20730 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
20740 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
20750 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
20760 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
20770 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
20780 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
20790 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
207a0 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
207b0 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
207c0 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
207d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
207e0 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
207f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
20800 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
20810 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
20820 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
20830 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
20840 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
20850 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
20860 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
20870 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
20880 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
20890 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
208a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
208b0 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
208c0 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
208d0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
208e0 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
208f0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20900 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
20910 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
20920 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
20930 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
20940 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
20950 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
20960 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20970 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20980 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
20990 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
209a0 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
209b0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
209c0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
209d0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
209e0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
209f0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
20a00 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
20a10 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
20a20 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
20a30 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
20a40 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
20a50 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
20a60 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
20a70 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
20a80 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
20a90 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20aa0 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
20ab0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
20ac0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
20ad0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
20ae0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
20af0 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
20b00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
20b10 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
20b20 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
20b30 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
20b40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
20b50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
20b60 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
20b70 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20b80 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
20b90 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
20ba0 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
20bb0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
20bc0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20bd0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
20be0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
20bf0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
20c00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
20c10 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
20c20 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
20c30 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20c40 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
20c50 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
20c60 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
20c70 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20c80 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
20c90 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
20ca0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20cb0 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
20cc0 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
20cd0 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
20ce0 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
20cf0 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
20d00 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
20d10 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
20d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20d30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20d40 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
20d50 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
20d60 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20d70 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
20d80 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
20d90 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
20da0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
20db0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
20dc0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
20dd0 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
20de0 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
20df0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
20e00 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
20e10 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
20e20 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
20e30 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
20e40 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
20e50 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
20e60 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
20e70 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
20e80 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
20e90 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
20ea0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
20eb0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
20ec0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
20ed0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
20ee0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
20ef0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
20f00 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
20f10 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
20f20 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
20f30 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
20f40 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
20f50 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
20f60 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
20f70 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
20f80 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
20f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
20fa0 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
20fb0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
20fc0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
20fd0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
20fe0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
20ff0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21000 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
21010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21020 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
21030 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21040 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21050 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
21060 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
21070 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
21080 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
21090 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
210a0 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
210b0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
210c0 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
210d0 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
210e0 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
210f0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
21100 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
21110 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
21120 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
21130 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
21140 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
21150 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
21160 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
21170 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
21180 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21190 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
211a0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
211b0 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
211c0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
211d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
211e0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
211f0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21200 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21210 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
21220 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
21230 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
21240 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
21250 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
21260 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
21270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
21280 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
21290 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
212a0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
212b0 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
212c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
212d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
212e0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
212f0 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
21300 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
21310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21320 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21330 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
21340 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
21350 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
21360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21370 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
21380 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
21390 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
213a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
213b0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
213c0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
213d0 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
213e0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
213f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
21400 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
21410 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
21420 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
21430 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
21440 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
21450 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
21460 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c  /*.** Invoke SQL
21470 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c  ITE_FCNTL_MMAP_L
21480 49 4d 49 54 20 62 61 73 65 64 20 6f 6e 20 74 68  IMIT based on th
21490 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
214a0 6f 66 20 6d 78 4d 6d 61 70 2e 0a 2a 2f 0a 73 74  of mxMmap..*/.st
214b0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
214c0 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72  ixMaplimit(Pager
214d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
214e0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
214f0 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66  pPager->fd;.  if
21500 28 20 69 73 4f 70 65 6e 28 66 64 29 20 29 7b 0a  ( isOpen(fd) ){.
21510 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65      pPager->bUse
21520 46 65 74 63 68 20 3d 20 28 66 64 2d 3e 70 4d 65  Fetch = (fd->pMe
21530 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
21540 3d 33 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6d  =3) && pPager->m
21550 78 4d 6d 61 70 3e 30 3b 0a 20 20 20 20 73 71 6c  xMmap>0;.    sql
21560 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
21570 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
21580 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  , SQLITE_FCNTL_M
21590 4d 41 50 5f 4c 49 4d 49 54 2c 0a 20 20 20 20 20  MAP_LIMIT,.     
215a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215b0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 26          (void*)&
215c0 70 50 61 67 65 72 2d 3e 6d 78 4d 6d 61 70 29 3b  pPager->mxMmap);
215d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
215e0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
215f0 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d   size of any mem
21600 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65  ory mapping made
21610 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21620 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
21630 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
21640 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  apLimit(Pager *p
21650 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69  Pager, sqlite3_i
21660 6e 74 36 34 20 6d 78 4d 6d 61 70 29 7b 0a 20 20  nt64 mxMmap){.  
21670 70 50 61 67 65 72 2d 3e 6d 78 4d 6d 61 70 20 3d  pPager->mxMmap =
21680 20 6d 78 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72   mxMmap;.  pager
21690 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67  FixMaplimit(pPag
216a0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  er);.}../*.** Fr
216b0 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
216c0 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
216d0 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  om the pager..*/
216e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
216f0 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a  erShrink(Pager *
21700 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
21710 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70  e3PcacheShrink(p
21720 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
21730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
21740 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
21750 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21760 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
21770 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
21780 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
21790 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
217a0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
217b0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
217c0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
217d0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
217e0 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
217f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
21800 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
21810 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
21820 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
21830 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
21840 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
21850 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
21860 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
21870 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
21880 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
21890 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
218a0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
218b0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
218c0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
218d0 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
218e0 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
218f0 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
21910 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
21920 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
21930 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
21940 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21950 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
21960 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
21970 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
21980 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
21990 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
219a0 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
219b0 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
219c0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
219e0 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
219f0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
21a00 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
21a10 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
21a20 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
21a30 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
21a40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21a50 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
21a60 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
21a70 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
21a80 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
21a90 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
21aa0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
21ab0 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
21ac0 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
21ad0 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
21ae0 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
21af0 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
21b00 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
21b10 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
21b20 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
21b30 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
21b40 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
21b50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21b60 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
21b70 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
21b80 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
21b90 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
21ba0 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
21bb0 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
21bc0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
21bd0 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
21be0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
21bf0 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
21c00 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
21c10 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
21c20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
21c30 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
21c40 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
21c50 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
21c60 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
21c70 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
21c80 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
21c90 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
21ca0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
21cb0 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
21cc0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
21cd0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
21ce0 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
21cf0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
21d00 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
21d10 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
21d20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
21d30 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
21d40 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
21d50 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
21d60 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
21d70 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
21d80 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
21d90 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
21da0 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
21db0 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
21dc0 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
21dd0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
21de0 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
21df0 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
21e00 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
21e10 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
21e20 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
21e30 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
21e40 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
21e50 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
21e60 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
21e70 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
21e80 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
21e90 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
21ea0 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
21eb0 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
21ec0 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
21ed0 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
21ee0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
21ef0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
21f00 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
21f10 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
21f20 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
21f30 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
21f40 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
21f50 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
21f60 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
21f70 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
21f80 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
21f90 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
21fa0 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
21fb0 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
21fc0 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
21fd0 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
21fe0 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
21ff0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
22000 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
22010 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
22020 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
22030 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
22040 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
22050 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
22060 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
22070 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65  etyLevel(.  Page
22080 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
22090 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
220a0 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
220b0 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  el for */.  int 
220c0 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  level,          
220d0 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63    /* PRAGMA sync
220e0 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c  hronous.  1=OFF,
220f0 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c   2=NORMAL, 3=FUL
22100 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75  L */  .  int bFu
22110 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f  llFsync,       /
22120 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79  * PRAGMA fullfsy
22130 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70  nc */.  int bCkp
22140 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a  tFullFsync    /*
22150 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
22160 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a  nt_fullfsync */.
22170 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  ){.  assert( lev
22180 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
22190 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  3 );.  pPager->n
221a0 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
221b0 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
221c0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
221d0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
221e0 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
221f0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
22200 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70  e) ?1:0;.  if( p
22210 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
22220 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22230 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
22240 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
22250 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
22260 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e  se if( bFullFsyn
22270 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22280 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
22290 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
222a0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
222b0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
222c0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
222d0 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75  else if( bCkptFu
222e0 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
222f0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22300 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
22310 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
22320 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22330 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
22340 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
22350 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22360 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22370 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
22380 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
22390 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
223a0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
223b0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
223c0 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73  lags = pPager->s
223d0 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  yncFlags;.  if( 
223e0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
223f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22400 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20  walSyncFlags |= 
22410 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
22420 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  TIONS;.  }.}.#en
22430 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
22440 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
22450 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
22460 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
22470 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
22480 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
22490 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
224a0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
224b0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
224c0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
224d0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
224e0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
224f0 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
22500 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
22510 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
22520 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
22530 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
22540 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
22550 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
22560 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
22570 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22580 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
22590 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
225a0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
225b0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
225c0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
225d0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
225e0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
225f0 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
22600 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
22610 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
22620 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
22630 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
22640 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
22650 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
22660 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
22670 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
22680 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22690 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
226a0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
226b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
226c0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
226d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
226e0 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
226f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
22700 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
22710 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
22720 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
22730 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
22740 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
22750 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
22760 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
22770 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
22780 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
22790 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
227a0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
227b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
227d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
227e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
227f0 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
22800 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
22810 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
22820 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
22830 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
22840 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
22850 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
22860 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
22870 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
22880 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
22890 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
228a0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
228b0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
228c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
228d0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
228e0 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
228f0 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
22900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22910 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
22920 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
22930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
22940 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
22950 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
22960 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
22970 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
22980 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
22990 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
229a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
229b0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
229c0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
229d0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
229e0 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
229f0 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
22a00 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
22a10 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
22a20 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
22a30 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
22a40 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
22a50 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
22a60 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
22a70 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
22a80 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
22a90 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
22aa0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
22ab0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
22ac0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
22ad0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
22ae0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
22af0 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
22b10 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
22b20 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
22b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b60 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
22b70 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
22b80 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
22b90 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
22ba0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
22bb0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
22bc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
22bd0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
22be0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
22bf0 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
22c00 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
22c10 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
22c20 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
22c30 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
22c40 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
22c50 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
22c60 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
22c70 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
22c80 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
22c90 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
22ca0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
22cb0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
22cc0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
22cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22ce0 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
22cf0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d10 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
22d20 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
22d30 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
22d40 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
22d50 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
22d60 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
22d70 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
22d80 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
22d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22da0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
22db0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
22dc0 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  */.){.  pPager->
22dd0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
22de0 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
22df0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
22e00 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
22e10 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28  ndlerArg;..  if(
22e20 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
22e30 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
22e40 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29  **ap = (void **)
22e50 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61  &pPager->xBusyHa
22e60 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72  ndler;.    asser
22e70 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64  t( ((int(*)(void
22e80 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42   *))(ap[0]))==xB
22e90 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20  usyHandler );.  
22ea0 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d    assert( ap[1]=
22eb0 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  =pBusyHandlerArg
22ec0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
22ed0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
22ee0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
22ef0 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41  ITE_FCNTL_BUSYHA
22f00 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61  NDLER, (void *)a
22f10 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
22f20 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
22f30 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
22f40 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
22f50 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
22f60 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
22f70 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
22f80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
22f90 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
22fa0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
22fb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
22fc0 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
22fd0 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
22fe0 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
22ff0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
23000 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
23010 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
23020 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54  _IOERR, an SQLIT
23030 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d  E_IOERR_xxx sub-
23040 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46  code or SQLITE_F
23050 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
23060 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
23070 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
23080 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
23090 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
230a0 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
230b0 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
230c0 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
230d0 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
230e0 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
230f0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
23100 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
23110 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
23120 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
23130 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
23140 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
23150 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
23160 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
23170 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
23180 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
23190 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
231a0 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
231b0 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
231c0 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
231d0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
231e0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
231f0 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
23200 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
23210 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
23220 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
23230 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
23240 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
23250 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
23260 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
23270 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
23280 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
23290 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
232a0 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
232b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
232c0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
232d0 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
232e0 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
232f0 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
23300 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
23310 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
23320 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
23330 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
23340 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
23350 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
23360 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
23370 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
23380 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
23390 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
233a0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
233b0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
233c0 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
233d0 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
233e0 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
233f0 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
23400 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
23410 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
23420 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
23430 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
23440 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
23450 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
23460 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
23470 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69  er, u32 *pPageSi
23480 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
23490 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
234a0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
234b0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
234c0 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61  e to do a full a
234d0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
234e0 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69  e() here, as thi
234f0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
23500 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72  may be called fr
23510 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f  om within PagerO
23520 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68  pen(), before th
23530 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20  e state.  ** of 
23540 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
23550 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63   is internally c
23560 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a  onsistent..  **.
23570 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    ** At one poin
23580 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
23590 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
235a0 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77  r if the pager w
235b0 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45  as in .  ** PAGE
235c0 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42  R_ERROR state. B
235d0 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45  ut since PAGER_E
235e0 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61  RROR state guara
235f0 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  ntees that.  ** 
23600 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73  there is at leas
23610 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
23620 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
23630 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
23640 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
23650 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e  for that case an
23660 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33  yhow..  */..  u3
23670 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  2 pageSize = *pP
23680 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
23690 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
236a0 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
236b0 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
236c0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
236d0 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ZE) );.  if( (pP
236e0 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
236f0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
23700 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74  ==0).   && sqlit
23710 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
23720 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
23730 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65  )==0 .   && page
23740 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
23750 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  !=(u32)pPager->p
23760 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  ageSize .  ){.  
23770 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e    char *pNew = N
23780 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ULL;            
23790 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61   /* New temp spa
237a0 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42  ce */.    i64 nB
237b0 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  yte = 0;..    if
237c0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
237d0 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69  >PAGER_OPEN && i
237e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
237f0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
23800 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
23810 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
23820 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
23830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  OK ){.      pNew
23850 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
23860 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
23870 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
23880 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53  ( !pNew ) rc = S
23890 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
238a0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
238b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
238c0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
238d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50  Pager);.      pP
238e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
238f0 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
23900 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
23910 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
23920 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
23930 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c  eSize;.      sql
23940 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
23950 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
23960 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
23970 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
23980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
23990 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
239a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
239b0 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
239c0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53  }.  }..  *pPageS
239d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
239e0 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63  geSize;.  if( rc
239f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23a00 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
23a10 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
23a20 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
23a30 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
23a40 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
23a50 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
23a60 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
23a70 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
23a80 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
23a90 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
23aa0 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c      pagerFixMapl
23ab0 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  imit(pPager);.  
23ac0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23ad0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
23ae0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
23af0 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
23b00 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
23b10 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
23b20 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
23b30 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
23b40 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
23b50 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
23b60 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
23b70 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
23b80 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
23b90 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
23ba0 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
23bb0 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
23bc0 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
23bd0 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
23be0 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
23bf0 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
23c00 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
23c10 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
23c20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
23c30 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
23c40 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
23c50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
23c60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
23c70 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
23c80 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
23c90 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
23ca0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
23cb0 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
23cc0 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
23cd0 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
23ce0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
23cf0 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
23d00 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
23d10 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
23d20 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
23d30 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
23d40 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
23d50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
23d60 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
23d70 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
23d80 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
23d90 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
23da0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
23db0 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
23dc0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
23dd0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
23de0 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
23df0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
23e00 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
23e10 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
23e20 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
23e30 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f  R_OPEN );      /
23e40 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79  * Called only by
23e50 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a   OP_MaxPgcnt */.
23e60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23e70 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72  ->mxPgno>=pPager
23e80 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20  ->dbSize );  /* 
23e90 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f  OP_MaxPgcnt enfo
23ea0 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72  rces this */.  r
23eb0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
23ec0 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
23ed0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
23ee0 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
23ef0 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
23f00 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
23f10 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
23f20 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
23f30 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
23f40 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
23f50 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
23f60 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
23f70 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
23f80 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
23f90 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
23fa0 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
23fb0 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
23fc0 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
23fd0 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
23fe0 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
23ff0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
24000 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
24010 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
24020 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
24030 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
24040 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
24050 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
24060 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
24070 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
24080 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
24090 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
240a0 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
240b0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
240c0 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
240d0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
240e0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
240f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
24100 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
24110 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
24120 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
24130 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
24140 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
24150 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
24160 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
24170 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
24180 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
24190 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
241a0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
241b0 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
241c0 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
241d0 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
241e0 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
241f0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
24200 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
24210 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
24220 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
24230 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
24240 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
24250 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
24260 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
24270 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
24280 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
24290 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
242a0 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
242b0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
242c0 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
242d0 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
242e0 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
242f0 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
24300 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
24310 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
24320 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
24330 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
24340 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
24350 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
24360 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
24370 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
24380 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
24390 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
243a0 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
243b0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
243c0 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
243d0 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
243e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
243f0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
24400 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24410 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
24420 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
24430 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24440 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
24450 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
24460 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
24470 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
24480 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
24490 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
244a0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
244b0 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69   by btree immedi
244c0 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61  ately after crea
244d0 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61  ting.  ** the Pa
244e0 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  ger object.  The
244f0 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
24500 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
24510 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a  o transition.  *
24520 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65  * to WAL mode ye
24530 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
24540 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
24550 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
24560 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
24570 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  fd) ){.    IOTRA
24580 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
24590 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
245a0 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
245b0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
245c0 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
245d0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
245e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
245f0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
24600 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24610 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24620 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24630 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
24640 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
24650 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72  d when a read-tr
24660 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
24670 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  n on.** the page
24680 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  r. It returns th
24690 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
246a0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
246b0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48  atabase..**.** H
246c0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66  owever, if the f
246d0 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31  ile is between 1
246e0 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e   and <page-size>
246f0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
24700 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73  then .** this is
24710 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20   considered a 1 
24720 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  page file..*/.vo
24730 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  id sqlite3PagerP
24740 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
24750 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
24760 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
24770 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
24780 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
24790 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
247a0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
247b0 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
247c0 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28  );.  *pnPage = (
247d0 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69  int)pPager->dbSi
247e0 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  ze;.}.../*.** Tr
247f0 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
24800 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74  ck of type lockt
24810 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ype on the datab
24820 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20  ase file. If.** 
24830 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65  a similar or gre
24840 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ater lock is alr
24850 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20  eady held, this 
24860 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
24870 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  -op.** (returnin
24880 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65  g SQLITE_OK imme
24890 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  diately)..**.** 
248a0 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d  Otherwise, attem
248b0 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  pt to obtain the
248c0 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69   lock using sqli
248d0 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76  te3OsLock(). Inv
248e0 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79  oke .** the busy
248f0 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
24900 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74   lock is current
24910 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
24920 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74  . Repeat .** unt
24930 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
24940 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c  back returns fal
24950 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
24960 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f  attempt to .** o
24970 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73  btain the lock s
24980 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
24990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
249a0 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
249b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
249c0 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
249d0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66  .** the lock. If
249e0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
249f0 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  ained successful
24a00 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ly, set the Page
24a10 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69  r.state .** vari
24a20 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  able to locktype
24a30 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
24a40 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
24a50 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
24a60 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
24a70 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
24a80 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
24ab0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
24ac0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
24ad0 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
24ae0 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
24af0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
24b00 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
24b10 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  held, or one of 
24b20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73  the transistions
24b30 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
24b40 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
24b50 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
24b60 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
24b70 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
24b80 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
24b90 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
24ba0 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
24bb0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
24bc0 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  ck>=locktype).  
24bd0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
24be0 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
24bf0 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
24c00 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
24c10 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
24c20 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
24c30 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45  K && locktype==E
24c40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
24c50 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
24c60 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
24c70 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70  (pPager, locktyp
24c80 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  e);.  }while( rc
24c90 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
24ca0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
24cb0 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
24cc0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
24cd0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24ce0 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
24cf0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
24d00 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
24d10 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e  ) checks that on
24d20 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
24d30 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66  lowing is true f
24d40 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  or all dirty pag
24d50 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
24d60 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a  the page-cache:.
24d70 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70  **.**   a) The p
24d80 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  age number is le
24d90 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
24da0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
24db0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  the .**      cur
24dc0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d  rent database im
24dd0 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f  age, in pages, O
24de0 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20  R.**.**   b) if 
24df0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
24e00 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74   were written at
24e10 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77   this time, it w
24e20 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
24e30 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
24e40 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
24e50 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74  nt content out t
24e60 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
24e70 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65  l.**      (as de
24e80 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63  termined by func
24e90 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65  tion subjRequire
24ea0 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  sPage())..**.** 
24eb0 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  If the condition
24ec0 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69   asserted by thi
24ed0 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20  s function were 
24ee0 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68  not true, and th
24ef0 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
24f00 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61  were to be disca
24f10 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  rded from the ca
24f20 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65  che via the page
24f30 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75  rStress().** rou
24f40 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73  tine, pagerStres
24f50 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72  s() would not wr
24f60 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
24f70 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a  page content to.
24f80 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
24f90 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70  file. If a savep
24fa0 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
24fb0 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63   were rolled bac
24fc0 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20  k after.** this 
24fd0 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f  happened, the co
24fe0 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77  rrect behavior w
24ff0 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
25000 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
25010 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
25020 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
25030 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
25040 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
25050 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
25060 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25070 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
25080 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
25090 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
250a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
250b0 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
250c0 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
250d0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
250e0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
250f0 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
25100 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
25110 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
25120 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
25130 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
25140 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
25150 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
25160 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
25170 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
25180 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
25190 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
251a0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
251b0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
251c0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
251d0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
251e0 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
251f0 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
25200 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
25210 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
25220 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
25230 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
25240 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
25250 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
25260 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
25270 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25280 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
25290 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
252a0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
252b0 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
252c0 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
252d0 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
252e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
252f0 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
25300 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
25310 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
25320 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
25330 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25340 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
25350 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
25360 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
25370 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
25380 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
25390 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
253a0 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
253b0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
253c0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
253d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
253e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
253f0 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
25400 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
25410 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
25420 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63  * Once this func
25430 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61  tion has been ca
25440 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61  lled, the transa
25450 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65  ction must eithe
25460 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  r be.** rolled b
25470 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64  ack or committed
25480 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65  . It is not safe
25490 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
254a0 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68  nction and.** th
254b0 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74  en continue writ
254c0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
254d0 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ase..*/.void sql
254e0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
254f0 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
25500 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
25510 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
25520 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
25530 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
25540 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
25550 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
25560 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
25570 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
25580 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  e;..  /* At one 
25590 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68  point the code h
255a0 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72  ere called asser
255b0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
255c0 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e  int() to.  ** en
255d0 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61  sure that all pa
255e0 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61  ges being trunca
255f0 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73  ted away by this
25600 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a   operation are,.
25610 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d    ** if one or m
25620 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ore savepoints a
25630 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74  re open, present
25640 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e   in the savepoin
25650 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  t .  ** journal 
25660 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
25670 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20   be restored if 
25680 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
25690 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63   rolled.  ** bac
256a0 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f  k. This is no lo
256b0 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61  nger necessary a
256c0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
256d0 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a  is now only.  **
256e0 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
256f0 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
25700 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53  a transaction. S
25710 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a  o although the .
25720 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    ** Pager objec
25730 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65  t may still have
25740 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
25750 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
25760 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68  nt!=0), .  ** th
25770 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  ey cannot be rol
25780 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65  led back. So the
25790 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
257a0 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c  onstraint() call
257b0 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  .  ** is no long
257c0 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d  er correct. */.}
257d0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
257e0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
257f0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
25800 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
25810 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a   rollback. It.**
25820 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
25830 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c  al file to disk,
25840 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65   then sets pPage
25850 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  r->journalHdr to
25860 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20   the.** size of 
25870 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25880 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
25890 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
258a0 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74  utine knows.** t
258b0 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a  hat the entire j
258c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
258d0 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  been synced..**.
258e0 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74  ** Syncing a hot
258f0 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b  -journal to disk
25900 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
25910 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ng to roll it ba
25920 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74  ck ensures .** t
25930 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66  hat if a power-f
25940 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75  ailure occurs du
25950 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
25960 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  k, the process t
25970 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  hat.** attempts 
25980 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
25990 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65  ng system recove
259a0 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65  ry sees the same
259b0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74   journal.** cont
259c0 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63  ent as this proc
259d0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ess..**.** If ev
259e0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73  erything goes as
259f0 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45   planned, SQLITE
25a00 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
25a10 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
25a20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
25a30 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
25a40 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74  int pagerSyncHot
25a50 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
25a60 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
25a70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25a80 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
25a90 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
25aa0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
25ab0 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
25ac0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
25ad0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
25ae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
25af0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
25b00 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
25b10 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d, &pPager->jour
25b20 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  nalHdr);.  }.  r
25b30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25b40 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65  ** Obtain a refe
25b50 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72  rence to a memor
25b60 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62  y mapped page ob
25b70 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75  ject for page nu
25b80 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54  mber pgno. .** T
25b90 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69  he new object wi
25ba0 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74  ll use the point
25bb0 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e  er pData, obtain
25bc0 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29  ed from xFetch()
25bd0 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
25be0 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20  ul, set *ppPage 
25bf0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
25c00 6e 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e  new page referen
25c10 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ce.** and return
25c20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
25c30 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
25c40 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
25c50 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70  de and set.** *p
25c60 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a  pPage to zero..*
25c70 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65  *.** Page refere
25c80 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79  nces obtained by
25c90 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
25ca0 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
25cb0 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20   released.** by 
25cc0 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c  calling pagerRel
25cd0 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  easeMapPage()..*
25ce0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
25cf0 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
25d00 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
25d10 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
25d20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
25d30 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ect */.  Pgno pg
25d40 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
25d50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
25d60 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69   number */.  voi
25d70 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  d *pData,       
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d90 78 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20  xFetch()'d data 
25da0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
25db0 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67  .  PgHdr **ppPag
25dc0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
25dd0 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69     /* OUT: Acqui
25de0 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  red page object 
25df0 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  */.){.  PgHdr *p
25e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25e10 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
25e20 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f  y mapped page to
25e30 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66   return */..  if
25e40 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  ( pPager->pMmapF
25e50 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a  reelist ){.    *
25e60 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50 61  ppPage = p = pPa
25e70 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
25e80 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  st;.    pPager->
25e90 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20  pMmapFreelist = 
25ea0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70  p->pDirty;.    p
25eb0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
25ec0 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74    memset(p->pExt
25ed0 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  ra, 0, pPager->n
25ee0 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b  Extra);.  }else{
25ef0 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
25f00 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69   = (PgHdr *)sqli
25f10 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
25f20 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50  zeof(PgHdr) + pP
25f30 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
25f40 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
25f50 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
25f60 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
25f70 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20  , (i64)(pgno-1) 
25f80 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
25f90 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
25fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25fb0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
25fc0 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f   p->pExtra = (vo
25fd0 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20  id *)&p[1];.    
25fe0 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52  p->flags = PGHDR
25ff0 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52  _MMAP;.    p->nR
26000 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70  ef = 1;.    p->p
26010 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
26020 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
26030 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20  ->pExtra==(void 
26040 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73  *)&p[1] );.  ass
26050 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30  ert( p->pPage==0
26060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26070 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d  >flags==PGHDR_MM
26080 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AP );.  assert( 
26090 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  p->pPager==pPage
260a0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
260b0 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20  ->nRef==1 );..  
260c0 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  p->pgno = pgno;.
260d0 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61    p->pData = pDa
260e0 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d  ta;.  pPager->nM
260f0 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74  mapOut++;..  ret
26100 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26110 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
26120 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
26130 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73  age pPg. pPg mus
26140 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75  t have been retu
26150 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65  rned by an .** e
26160 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70  arlier call to p
26170 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
26180 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ge()..*/.static 
26190 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61 73  void pagerReleas
261a0 65 4d 61 70 50 61 67 65 28 50 67 48 64 72 20 2a  eMapPage(PgHdr *
261b0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
261c0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
261d0 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ger;.  pPager->n
261e0 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67  MmapOut--;.  pPg
261f0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65  ->pDirty = pPage
26200 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
26210 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  ;.  pPager->pMma
26220 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b  pFreelist = pPg;
26230 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
26240 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
26250 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b  ->iVersion>=3 );
26260 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65  .  sqlite3OsUnfe
26270 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
26280 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d  (i64)(pPg->pgno-
26290 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  1)*pPager->pageS
262a0 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  ize, pPg->pData)
262b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
262c0 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74  all PgHdr object
262d0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
262e0 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c  Pager.pMmapFreel
262f0 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ist list..*/.sta
26300 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
26310 65 65 4d 61 70 48 64 72 73 28 50 61 67 65 72 20  eeMapHdrs(Pager 
26320 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
26330 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70  r *p;.  PgHdr *p
26340 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50  Next;.  for(p=pP
26350 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26360 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  ist; p; p=pNext)
26370 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
26380 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c  >pDirty;.    sql
26390 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
263a0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  }.}.../*.** Shut
263b0 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
263c0 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
263d0 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
263e0 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
263f0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
26400 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
26410 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
26420 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
26430 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
26440 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
26450 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
26460 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
26470 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
26480 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
26490 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
264a0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
264b0 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
264c0 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
264d0 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
264e0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
264f0 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
26500 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
26510 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
26520 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
26530 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
26540 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
26550 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
26560 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
26570 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
26580 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
26590 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
265a0 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
265b0 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
265c0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
265d0 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
265e0 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
265f0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
26600 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
26610 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
26620 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70  pPager){.  u8 *p
26630 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67  Tmp = (u8 *)pPag
26640 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  er->pTmpSpace;..
26650 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
26660 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
26670 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c  ger) );.  disabl
26680 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
26690 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
266a0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
266b0 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46 72  loc();.  pagerFr
266c0 65 65 4d 61 70 48 64 72 73 28 70 50 61 67 65 72  eeMapHdrs(pPager
266d0 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
266e0 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a  errCode = 0; */.
266f0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
26700 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66  iveMode = 0;.#if
26710 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26720 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61  _WAL.  sqlite3Wa
26730 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  lClose(pPager->p
26740 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70  Wal, pPager->ckp
26750 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67  tSyncFlags, pPag
26760 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54  er->pageSize, pT
26770 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  mp);.  pPager->p
26780 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Wal = 0;.#endif.
26790 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
267a0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ager);.  if( MEM
267b0 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  DB ){.    pager_
267c0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
267d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
267e0 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73  If it is open, s
267f0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
26800 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
26810 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ing UnlockAndRol
26820 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66  lback..    ** If
26830 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e   this is not don
26840 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e  e, then an unsyn
26850 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
26860 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
26870 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79  .    ** file may
26880 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
26890 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
268a0 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
268b0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20  ilure occurs .  
268c0 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20    ** while this 
268d0 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
268e0 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
268f0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
26900 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
26910 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
26920 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
26930 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  o sync the journ
26940 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61  al, shift the pa
26950 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ger.    ** into 
26960 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
26970 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c   This causes Unl
26980 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74  ockAndRollback t
26990 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20  o unlock the.   
269a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64   ** database and
269b0 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
269c0 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  al file without 
269d0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
269e0 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63  ll it.    ** bac
269f0 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74  k or finalize it
26a00 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62  . The next datab
26a10 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61  ase user will ha
26a20 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75  ve to do hot-jou
26a30 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  rnal.    ** roll
26a40 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65  back before acce
26a50 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
26a60 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
26a70 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
26a80 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
26a90 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
26aa0 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79  (pPager, pagerSy
26ab0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
26ac0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
26ad0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
26ae0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
26af0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
26b00 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
26b10 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
26b20 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
26b30 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
26b40 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
26b50 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
26b60 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
26b70 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
26b80 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ).  sqlite3OsClo
26b90 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
26ba0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
26bb0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
26bc0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
26bd0 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65  (pTmp);.  sqlite
26be0 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
26bf0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
26c00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
26c10 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
26c20 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
26c30 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
26c40 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
26c50 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
26c60 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
26c70 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
26c80 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
26c90 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
26ca0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
26cb0 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
26cc0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
26cd0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
26ce0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
26cf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26d00 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
26d10 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
26d20 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
26d30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
26d40 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
26d50 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
26d60 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
26d70 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
26d80 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
26d90 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
26da0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
26db0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
26dc0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
26dd0 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
26de0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
26df0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
26e00 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
26e10 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
26e20 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
26e30 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
26e40 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
26e50 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
26e60 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
26e70 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
26e80 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
26e90 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
26ea0 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
26eb0 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
26ec0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
26ed0 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
26ee0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
26ef0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
26f00 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73  r.noSync flag is
26f10 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
26f20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
26f30 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
26f40 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
26f50 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
26f60 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
26f70 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64  de and the .** d
26f80 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
26f90 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c  stics of the fil
26fa0 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c  e-system, as fol
26fb0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
26fc0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
26fd0 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ile is an in-mem
26fe0 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
26ff0 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64  , no action need
27000 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e  .**     be taken
27010 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65  ..**.**   * Othe
27020 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65  rwise, if the de
27030 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
27040 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41  pport the SAFE_A
27050 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a  PPEND property,.
27060 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20  **     then the 
27070 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68  nRec field of th
27080 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
27090 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20  written journal 
270a0 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73  header.**     is
270b0 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74   updated to cont
270c0 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
270d0 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  f journal record
270e0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
270f0 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20     been written 
27100 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66  following it. If
27110 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70   the pager is op
27120 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d  erating in full-
27130 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65  sync.**     mode
27140 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
27150 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
27160 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69  d before this fi
27170 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a  eld is updated..
27180 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
27190 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
271a0 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51   support the SEQ
271b0 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79  UENTIAL property
271c0 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a  , then .**     j
271d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
271e0 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ynced..**.** Or,
271f0 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a   in pseudo-code:
27200 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54  .**.**   if( NOT
27210 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72   <in-memory jour
27220 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69  nal> ){.**     i
27230 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45  f( NOT SAFE_APPE
27240 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ND ){.**       i
27250 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f  f( <full-sync mo
27260 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  de> ) xSync(<jou
27270 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
27280 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52        <update nR
27290 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20  ec field>.**    
272a0 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   } .**     if( N
272b0 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20  OT SEQUENTIAL ) 
272c0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
272d0 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  ile>);.**   }.**
272e0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
272f0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
27300 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52  clears the PGHDR
27310 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
27320 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67  of every .** pag
27330 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  e currently held
27340 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72   in memory befor
27350 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  e returning SQLI
27360 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a  TE_OK. If an IO.
27370 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ** error is enco
27380 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68  untered, then th
27390 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
273a0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
273b0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
273c0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
273d0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
273e0 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b  er, int newHdr){
273f0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27410 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27420 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
27430 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
27440 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
27450 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
27460 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
27470 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
27480 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
27490 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
274a0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
274b0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
274c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
274d0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
274e0 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
274f0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ock(pPager);.  i
27500 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27510 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
27520 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
27530 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
27540 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
27550 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
27560 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27570 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
27580 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
27590 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
275a0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63  EMORY ){.      c
275b0 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73  onst int iDc = s
275c0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
275d0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
275e0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
275f0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
27600 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
27610 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
27620 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
27630 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
27640 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
27650 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68  block deals with
27660 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62   an obscure prob
27670 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74  lem. If the last
27680 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
27690 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74      ** that wrot
276a0 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  e to this databa
276b0 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67  se was operating
276c0 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a   in persistent-j
276d0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
276e0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  * mode, then the
276f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
27700 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
27710 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67  actually be larg
27720 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  er.        ** th
27730 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  an Pager.journal
27740 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68  Off bytes. If th
27750 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20  e next thing in 
27760 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
27770 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70      ** file happ
27780 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72  ens to be a jour
27790 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74  nal-header (writ
277a0 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74  ten as part of t
277b0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
277c0 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f  evious connectio
277d0 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  n's transaction)
277e0 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72  , and a crash or
277f0 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a   power-failure .
27800 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72          ** occur
27810 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20  s after nRec is 
27820 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f  updated but befo
27830 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  re this connecti
27840 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20  on writes .     
27850 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65     ** anything e
27860 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  lse to the journ
27870 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d  al file (or comm
27880 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69  its/rolls back i
27890 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts .        ** t
278a0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65  ransaction), the
278b0 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63  n SQLite may bec
278c0 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65  ome confused whe
278d0 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20  n doing the .   
278e0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
278f0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  nal rollback fol
27900 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e  lowing recovery.
27910 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63   It may roll bac
27920 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  k all.        **
27930 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
27940 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20  ions data, then 
27950 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69  proceed to rolli
27960 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c  ng back the old,
27970 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d  .        ** out-
27980 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61  of-date data tha
27990 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61  t follows it. Da
279a0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
279b0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
279c0 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b        ** To work
279d0 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
279e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
279f0 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f  e does appear to
27a00 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20   contain.       
27a10 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64   ** a valid head
27a20 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67  er following Pag
27a30 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74  er.journalOff, t
27a40 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30  hen write a 0x00
27a50 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
27a60 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
27a70 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69   it to prevent i
27a80 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63  t from being rec
27a90 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20  ognized..       
27aa0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56   **.        ** V
27ab0 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72  ariable iNextHdr
27ac0 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
27ad0 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77   the offset at w
27ae0 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20  hich this.      
27af0 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63    ** problematic
27b00 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63   header will occ
27b10 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ur, if it exists
27b20 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64  . aMagic is used
27b30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20   .        ** as 
27b40 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
27b50 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68  er to inspect th
27b60 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f  e first couple o
27b70 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20  f bytes of.     
27b80 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74     ** the potent
27b90 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ial journal head
27ba0 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  er..        */. 
27bb0 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74         i64 iNext
27bc0 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  HdrOffset;.     
27bd0 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b     u8 aMagic[8];
27be0 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61  .        u8 zHea
27bf0 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
27c00 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20  nalMagic)+4];.. 
27c10 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48         memcpy(zH
27c20 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
27c30 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
27c40 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
27c50 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
27c60 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
27c70 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
27c80 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
27c90 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64  .        iNextHd
27ca0 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61  rOffset = journa
27cb0 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
27cc0 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r);.        rc =
27cd0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
27ce0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
27cf0 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f  ic, 8, iNextHdrO
27d00 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
27d10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27d20 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61  K && 0==memcmp(a
27d30 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
27d40 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20  agic, 8) ){.    
27d50 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
27d60 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d  st u8 zerobyte =
27d70 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
27d80 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
27d90 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
27da0 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65  zerobyte, 1, iNe
27db0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
27dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27de0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
27df0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
27e00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
27e10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
27e20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
27e30 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
27e40 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
27e50 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
27e60 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
27e70 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
27e80 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
27e90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
27ea0 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
27eb0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
27ec0 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
27ed0 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
27ee0 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
27ef0 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
27f00 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
27f10 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
27f20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
27f30 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
27f40 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
27f50 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
27f60 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
27f70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
27f80 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
27f90 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
27fa0 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
27fb0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
27fc0 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
27fd0 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
27fe0 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
27ff0 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
28000 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
28010 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
28020 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
28030 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
28040 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
28050 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
28060 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
28070 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
28080 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28090 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
280a0 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69  ullSync && 0==(i
280b0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
280c0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
280d0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
280e0 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
280f0 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
28100 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
28110 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
28120 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
28130 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
28140 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28150 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
28160 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
28170 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  Flags);.        
28180 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28190 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
281a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
281b0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
281c0 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
281d0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
281e0 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
281f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28200 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
28210 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
28220 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
28230 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
28240 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20  er->journalHdr. 
28250 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
28260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28270 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
28280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28290 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
282a0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
282b0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
282c0 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
282d0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
282e0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
282f0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
28300 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
28310 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
28320 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28330 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
28340 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
28350 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  ncFlags| .      
28360 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
28370 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  cFlags==SQLITE_S
28380 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
28390 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
283a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
283b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
283c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
283d0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
283e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
283f0 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
28400 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20  ournalOff;.     
28410 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30   if( newHdr && 0
28420 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
28430 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
28440 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
28450 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
28460 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
28470 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
28480 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
28490 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
284a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
284b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
284c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
284d0 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
284e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
284f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c   }.  }..  /* Unl
28500 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
28510 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c   in noSync mode,
28520 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28530 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a  e was just .  **
28540 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
28550 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  nced. Either way
28560 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  , clear the PGHD
28570 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
28580 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61   on .  ** all pa
28590 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ges..  */.  sqli
285a0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79  te3PcacheClearSy
285b0 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  ncFlags(pPager->
285c0 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67  pPCache);.  pPag
285d0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
285e0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b  ER_WRITER_DBMOD;
285f0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
28600 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
28610 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
28620 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28630 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
28640 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
28650 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
28660 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
28670 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20  connected.** by 
28680 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
28690 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66   pointer. This f
286a0 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65  unction writes e
286b0 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a  ach one of the.*
286c0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  * in-memory page
286d0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f  s in the list to
286e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
286f0 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  le. The argument
28700 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c   may.** be NULL,
28710 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e   representing an
28720 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20   empty list. In 
28730 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66  this case this f
28740 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20  unction is.** a 
28750 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
28760 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64   pager must hold
28770 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
28780 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74  RVED lock when t
28790 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
287a0 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72  is called. Befor
287b0 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69  e writing anythi
287c0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
287d0 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f  se file, this lo
287e0 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65  ck.** is upgrade
287f0 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  d to an EXCLUSIV
28800 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  E lock. If the l
28810 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
28820 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  tained,.** SQLIT
28830 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
28840 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69  ed and no data i
28850 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
28860 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
28870 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
28880 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ger is a temp-fi
28890 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  le pager and the
288a0 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73   actual file-sys
288b0 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e  tem file.** is n
288c0 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20  ot yet open, it 
288d0 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f  is created and o
288e0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79  pened before any
288f0 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69   data is .** wri
28900 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20  tten out..**.** 
28910 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  Once the lock ha
28920 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20  s been upgraded 
28930 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
28940 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  y, the file open
28950 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73  ed,.** the pages
28960 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74   are written out
28970 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28980 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72   file in list or
28990 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20  der. Writing.** 
289a0 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65  a page is skippe
289b0 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69  d if it meets ei
289c0 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ther of the foll
289d0 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a  owing criteria:.
289e0 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
289f0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  ge number is gre
28a00 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e  ater than Pager.
28a10 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20  dbSize, or.**   
28a20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  * The PGHDR_DONT
28a30 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73  _WRITE flag is s
28a40 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  et on the page..
28a50 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67  **.** If writing
28a60 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73   out a page caus
28a70 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
28a80 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61  file to grow, Pa
28a90 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ger.dbFileSize.*
28aa0 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63  * is updated acc
28ab0 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67  ordingly. If pag
28ac0 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f  e 1 is written o
28ad0 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ut, then the val
28ae0 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20  ue cached.** in 
28af0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
28b00 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  [] is updated to
28b10 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76   match the new v
28b20 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
28b30 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
28b40 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
28b50 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
28b60 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
28b70 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
28b80 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
28b90 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20  * occurs, an IO 
28ba0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
28bb0 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74  turned. Or, if t
28bc0 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
28bd0 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f  k cannot.** be o
28be0 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f  btained, SQLITE_
28bf0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
28c00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28c10 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
28c20 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67  list(Pager *pPag
28c30 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74  er, PgHdr *pList
28c40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
28c50 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
28c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
28c70 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
28c80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28c90 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
28ca0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  or rollback page
28cb0 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  rs in WRITER_DBM
28cc0 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61  OD state. */.  a
28cd0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
28ce0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
28cf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28d00 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
28d10 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20  RITER_DBMOD );. 
28d20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28d30 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
28d40 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
28d50 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
28d60 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
28d70 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
28d80 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
28d90 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
28da0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
28db0 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
28dc0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
28dd0 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
28de0 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
28df0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
28e00 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
28e10 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
28e20 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
28e30 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
28e40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28e50 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
28e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
28e70 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
28e80 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
28e90 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
28ea0 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
28eb0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68  ..  /* Before th
28ec0 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67  e first write, g
28ed0 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69  ive the VFS a hi
28ee0 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66  nt of what the f
28ef0 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73  inal.  ** file s
28f00 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a  ize will be..  *
28f10 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  /.  assert( rc!=
28f20 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
28f30 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
28f40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
28f50 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 28 70  ITE_OK .   && (p
28f60 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 3f 20 70  List->pDirty ? p
28f70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20  Pager->dbSize : 
28f80 70 4c 69 73 74 2d 3e 70 67 6e 6f 2b 31 29 3e 70  pList->pgno+1)>p
28f90 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
28fa0 65 20 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  e .  ){.    sqli
28fb0 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
28fc0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
28fd0 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
28fe0 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
28ff0 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
29000 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
29010 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
29020 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
29030 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
29040 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
29050 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
29060 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
29070 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
29080 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
29090 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
290a0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
290b0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
290c0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
290d0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
290e0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
290f0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
29100 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
29110 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
29120 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
29130 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
29140 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
29150 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
29160 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
29170 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
29180 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
29190 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
291a0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
291b0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
291c0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
291d0 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
291e0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
291f0 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
29200 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
29210 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
29220 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
29230 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
29240 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
29250 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
29260 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
29270 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
29280 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
29290 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
292a0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
292b0 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
292c0 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
292d0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
292e0 3b 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 20 20 20                  
29300 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
29310 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
29320 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
29330 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
29340 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
29350 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
29360 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
29370 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
29380 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20  nter(pList);..  
29390 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
293a0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
293b0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
293c0 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
293d0 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
293e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
293f0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
29400 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
29410 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
29420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29430 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
29440 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
29450 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
29460 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
29470 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
29480 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
29490 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
294a0 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
294b0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
294c0 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
294d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
294e0 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
294f0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
29500 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
29510 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
29520 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
29530 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
29540 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
29550 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
29560 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
29570 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
29580 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
29590 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
295a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
295b0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
295c0 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
295d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
295e0 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
295f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
29600 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
29610 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b  R_STAT_WRITE]++;
29620 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
29630 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a  e any backup obj
29640 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65  ects copying the
29650 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
29660 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20  s pager. */.    
29670 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
29680 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
29690 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
296a0 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b  *)pList->pData);
296b0 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ..      PAGERTRA
296c0 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE(("STORE %d pa
296d0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
296e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
296f0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
29700 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
29710 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
29720 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f  ist)));.      IO
29730 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
29740 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
29750 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
29760 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
29770 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
29780 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ount);.    }else
29790 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
297a0 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
297b0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
297c0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
297d0 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  o));.    }.    p
297e0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
297f0 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c  h(pList);.    pL
29800 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
29810 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
29820 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29830 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
29840 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
29850 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20   is open. If it 
29860 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
29870 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
29880 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
29890 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
298a0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
298b0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
298c0 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
298d0 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   An .** SQLITE_I
298e0 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
298f0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
29900 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  if a call to sql
29910 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a  ite3OsOpen() .**
29920 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
29930 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
29940 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
29950 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
29960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
29970 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
29980 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  >sjfd) ){.    if
29990 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
299a0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
299b0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
299c0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
299d0 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
299e0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
299f0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
29a00 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
29a10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
29a20 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
29a30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
29a40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
29a50 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
29a60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29a70 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
29a80 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
29a90 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
29aa0 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
29ab0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
29ac0 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  * It is the call
29ad0 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
29ae0 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65  ty to use subjRe
29af0 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
29b00 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69  check .** that i
29b10 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
29b20 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ired before call
29b30 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
29b40 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
29b50 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
29b60 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
29b70 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
29b80 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
29b90 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
29ba0 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
29bb0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
29bc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
29bd0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
29be0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
29bf0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
29c00 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
29c10 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
29c20 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
29c30 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
29c40 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
29c50 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
29c60 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
29c70 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
29c80 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
29c90 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
29ca0 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
29cb0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
29cc0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
29cd0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
29ce0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
29cf0 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61  Pager;.  if( pPa
29d00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
29d10 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
29d20 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20  ODE_OFF ){..    
29d30 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
29d40 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68  journal, if it h
29d50 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
29d60 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  een opened */.  
29d70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29d80 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
29d90 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
29da0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
29db0 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
29dc0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73  Pager) );.    as
29dd0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
29de0 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50  ger->sjfd) || pP
29df0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30  ager->nSubRec==0
29e00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29e10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
29e20 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  er) .         ||
29e30 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
29e40 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
29e50 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
29e60 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
29e70 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
29e80 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
29e90 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
29ea0 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
29eb0 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
29ec0 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
29ed0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
29ee0 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
29ef0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
29f00 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
29f10 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
29f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29f30 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
29f40 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
29f50 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
29f60 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75  (i64)pPager->nSu
29f70 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
29f80 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
29f90 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
29fa0 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70   .      CODEC2(p
29fb0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
29fc0 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
29fd0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
29fe0 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
29ff0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
2a000 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
2a010 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2a020 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2a030 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
2a040 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2a050 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
2a060 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
2a070 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a0a0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
2a0b0 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
2a0c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2a0d0 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
2a0e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2a0f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a100 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
2a110 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
2a120 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
2a130 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
2a140 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
2a150 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
2a160 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
2a170 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2a190 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2a1a0 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
2a1b0 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
2a1c0 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
2a1d0 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
2a1e0 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
2a1f0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
2a200 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
2a210 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
2a220 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
2a230 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
2a240 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
2a250 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
2a260 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
2a270 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a280 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
2a290 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
2a2a0 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
2a2b0 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
2a2c0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2a2d0 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
2a2e0 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
2a2f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2a300 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
2a310 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
2a320 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
2a330 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
2a340 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2a350 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
2a360 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
2a370 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
2a380 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2a390 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
2a3a0 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
2a3b0 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
2a3c0 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
2a3d0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
2a3e0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
2a3f0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2a400 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
2a410 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
2a420 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2a430 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2a440 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2a450 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
2a460 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
2a470 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
2a480 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2a490 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
2a4a0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
2a4b0 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
2a4c0 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
2a4d0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
2a4e0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2a4f0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2a500 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
2a510 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2a520 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
2a530 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2a540 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
2a550 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2a560 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
2a570 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
2a580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a590 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
2a5a0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
2a5b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
2a5c0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2a5d0 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
2a5e0 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
2a5f0 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72 69  flag is set duri
2a600 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
2a610 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
2a620 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
2a630 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
2a640 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
2a650 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
2a660 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
2a670 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2a680 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
2a690 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
2a6a0 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
2a6b0 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
2a6c0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
2a6d0 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
2a6e0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  he doNotSpill fl
2a6f0 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ag inhibits all 
2a700 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72  cache spilling r
2a710 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2a720 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74  ther.  ** or not
2a730 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
2a740 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
2a750 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  t during a rollb
2a760 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ack..  **.  ** S
2a770 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20  pilling is also 
2a780 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20  prohibited when 
2a790 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
2a7a0 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75  e since that cou
2a7b0 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20  ld.  ** lead to 
2a7c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
2a7d0 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75  ion.   In the cu
2a7e0 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
2a7f0 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ton it .  ** is 
2a800 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2a810 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2a820 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2a830 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2a840 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==1.  ** while i
2a850 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2a860 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2a870 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2a880 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2a890 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2a8a0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2a8b0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2a8c0 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2a8d0 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2a8e0 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2a8f0 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2a900 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2a910 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2a920 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2a930 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2a940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a950 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
2a960 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72  NotSpill ) retur
2a970 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
2a980 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
2a990 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50  SyncSpill && (pP
2a9a0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
2a9b0 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
2a9c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a9d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
2a9e0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
2a9f0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
2aa00 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
2aa10 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
2aa20 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
2aa30 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
2aa40 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75  g. */.    if( su
2aa50 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
2aa60 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63  Pg) ){ .      rc
2aa70 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
2aa80 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20  e(pPg); .    }. 
2aa90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2aaa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2aab0 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
2aac0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
2aad0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
2aae0 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53  lse{.  .    /* S
2aaf0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2ab00 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
2ab10 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
2ab20 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2ab30 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c  ED_SYNC .     ||
2ab40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2ab50 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
2ab60 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20  CHEMOD.    ){.  
2ab70 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
2ab80 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b  rnal(pPager, 1);
2ab90 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2aba0 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
2abb0 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65  ber of this page
2abc0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2abd0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
2abe0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   of.    ** the d
2abf0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
2ac00 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
2ac10 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2ac20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  sub-journal..   
2ac30 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
2ac40 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
2ac50 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2ac60 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
2ac70 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74  l not.    ** act
2ac80 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61  ually write data
2ac90 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20   to the file in 
2aca0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a  this case..    *
2acb0 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65  *.    ** Conside
2acc0 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
2acd0 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
2ace0 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ts:.    **.    *
2acf0 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a  *   BEGIN;.    *
2ad00 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
2ad10 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
2ad20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58    <modify page X
2ad30 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56  >.    **     SAV
2ad40 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a  EPOINT sp;.    *
2ad50 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20  *       <shrink 
2ad60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2ad70 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a   Y pages>.    **
2ad80 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
2ad90 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a  ss(page X).    *
2ada0 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
2adb0 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  O sp;.    **.   
2adc0 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
2add0 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
2ade0 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
2adf0 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
2ae00 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
2ae10 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2ae20 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69  ase file, but wi
2ae30 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72  ll be dropped fr
2ae40 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68  om the cache. Th
2ae50 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  en,.    ** follo
2ae60 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41  wing the "ROLLBA
2ae70 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d  CK TO sp" statem
2ae80 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67  ent, reading pag
2ae90 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20  e X will read.  
2aea0 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
2aeb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2aec0 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
2aed0 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
2aee0 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77  X as it.    ** w
2aef0 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  as when the tran
2af00 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
2af10 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77   not as it was w
2af20 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73  hen "SAVEPOINT s
2af30 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78  p".    ** was ex
2af40 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  ecuted..    **. 
2af50 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
2af60 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
2af70 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
2af80 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
2af90 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
2afa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
2afb0 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
2afc0 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
2afd0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
2afe0 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65     ** be restore
2aff0 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  d to its current
2b000 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20   value when the 
2b010 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
2b020 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63   is .    ** exec
2b030 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uted..    */.   
2b040 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20   if( NEVER(.    
2b050 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
2b060 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
2b070 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
2b080 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2b090 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a  e(pPg).    ) ){.
2b0a0 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
2b0b0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
2b0c0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2b0d0 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
2b0e0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
2b0f0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2b100 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
2b110 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b120 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
2b130 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
2b140 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2b150 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
2b160 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2b170 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50  elist(pPager, pP
2b180 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
2b190 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
2b1a0 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
2b1b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b1c0 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
2b1d0 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
2b1e0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2b1f0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2b200 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
2b210 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2b220 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
2b230 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2b240 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2b250 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ); .}.../*.** Al
2b260 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2b270 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
2b280 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
2b290 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2b2a0 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
2b2b0 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
2b2c0 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
2b2d0 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
2b2e0 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
2b2f0 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
2b300 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
2b310 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
2b320 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
2b330 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2b340 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
2b350 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
2b360 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
2b370 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
2b380 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
2b390 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
2b3a0 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
2b3b0 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
2b3c0 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
2b3d0 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
2b3e0 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
2b3f0 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
2b400 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
2b410 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
2b420 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
2b430 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
2b440 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
2b450 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
2b460 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2b470 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
2b480 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2b490 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
2b4a0 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
2b4b0 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
2b4c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2b4d0 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
2b4e0 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
2b4f0 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
2b500 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
2b510 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
2b520 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
2b530 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
2b540 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a  GetExtra() API..
2b550 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
2b560 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
2b570 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
2b580 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
2b590 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
2b5a0 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
2b5b0 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
2b5c0 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
2b5d0 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
2b5e0 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a  * of the PAGER_*
2b5f0 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
2b600 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
2b610 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
2b620 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
2b630 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2b640 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
2b650 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
2b660 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
2b670 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
2b680 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
2b690 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
2b6a0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
2b6b0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
2b6c0 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
2b6d0 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
2b6e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2b6f0 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
2b700 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
2b710 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
2b720 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
2b730 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
2b740 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
2b750 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
2b760 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
2b770 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2b780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b790 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
2b7a0 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
2b7b0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
2b7c0 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
2b7d0 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
2b7e0 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
2b7f0 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
2b800 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
2b810 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2b820 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
2b830 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
2b840 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
2b850 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
2b860 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
2b870 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
2b880 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2b890 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2b8a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2b8b0 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
2b8c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b8d0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2b8e0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
2b8f0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2b900 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
2b910 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
2b920 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
2b930 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2b940 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
2b950 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
2b960 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
2b970 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
2b980 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
2b990 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
2b9a0 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
2b9b0 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
2b9c0 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
2b9d0 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
2b9e0 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
2b9f0 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
2ba00 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2ba10 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
2ba20 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
2ba30 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
2ba40 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
2ba50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2ba60 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2ba70 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
2ba80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2ba90 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
2baa0 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
2bab0 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
2bac0 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
2bad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2bae0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2baf0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
2bb00 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
2bb10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2bb20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2bb30 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
2bb40 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
2bb50 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
2bb60 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2bb70 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
2bb80 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
2bb90 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
2bba0 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
2bbb0 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
2bbc0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
2bbd0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2bbe0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2bbf0 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
2bc00 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
2bc10 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
2bc20 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
2bc30 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
2bc40 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
2bc50 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68  l */.  int pcach
2bc60 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
2bc70 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20  cacheSize();    
2bc80 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2bc90 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63  llocate for PCac
2bca0 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61  he */.  u32 szPa
2bcb0 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
2bcc0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2bcd0 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70  E;  /* Default p
2bce0 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f  age size */.  co
2bcf0 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d  nst char *zUri =
2bd00 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72   0;    /* URI ar
2bd10 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  gs to copy */.  
2bd20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20  int nUri = 0;   
2bd30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2bd40 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55  er of bytes of U
2bd50 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69  RI args at *zUri
2bd60 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
2bd70 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
2bd80 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
2bd90 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2bda0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
2bdb0 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
2bdc0 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
2bdd0 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
2bde0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
2bdf0 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
2be00 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
2be10 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
2be20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
2be30 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
2be40 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
2be50 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
2be60 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
2be70 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
2be80 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
2be90 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
2bea0 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
2beb0 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
2bec0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
2bed0 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
2bee0 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
2bef0 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
2bf00 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2bf10 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
2bf20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
2bf30 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
2bf40 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
2bf50 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
2bf60 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
2bf70 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
2bf80 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2bf90 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
2bfa0 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20  alSize(pVfs));. 
2bfb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
2bfc0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
2bfd0 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a  UND8(sqlite3MemJ
2bfe0 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20  ournalSize());. 
2bff0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
2c000 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
2c010 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
2c020 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2c030 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
2c040 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2c050 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
2c060 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  DB.  if( flags &
2c070 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b   PAGER_MEMORY ){
2c080 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a  .    memDb = 1;.
2c090 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
2c0a0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2c0b0 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68  ] ){.      zPath
2c0c0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  name = sqlite3Db
2c0d0 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e  StrDup(0, zFilen
2c0e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
2c0f0 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20  zPathname==0  ) 
2c100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2c110 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61 74 68  MEM;.      nPath
2c120 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2c130 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2c140 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  );.      zFilena
2c150 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
2c160 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
2c170 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
2c180 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
2c190 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
2c1a0 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
2c1b0 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
2c1c0 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
2c1d0 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
2c1e0 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
2c1f0 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
2c200 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
2c210 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
2c220 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
2c230 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2c240 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2c250 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ] ){.    const c
2c260 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74  har *z;.    nPat
2c270 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
2c280 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
2c290 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2c2a0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
2c2b0 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  , nPathname*2);.
2c2c0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2c2d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2c2e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2c2f0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  M;.    }.    zPa
2c300 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
2c310 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
2c320 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
2c330 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
2c340 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ails */.    rc =
2c350 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
2c360 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
2c370 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
2c380 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
2c390 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2c3a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2c3b0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Pathname);.    z
2c3c0 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65   = zUri = &zFile
2c3d0 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  name[sqlite3Strl
2c3e0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
2c3f0 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  1];.    while( *
2c400 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  z ){.      z += 
2c410 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c420 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  z)+1;.      z +=
2c430 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c440 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  (z)+1;.    }.   
2c450 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a   nUri = (int)(&z
2c460 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20  [1] - zUri);.   
2c470 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30   assert( nUri>=0
2c480 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
2c490 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
2c4a0 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
2c4b0 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
2c4c0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2c4d0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
2c4e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
2c4f0 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2c500 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2c510 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
2c520 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
2c530 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
2c540 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
2c550 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
2c560 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
2c570 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
2c580 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
2c590 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
2c5a0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
2c5b0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2c5c0 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
2c5d0 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
2c5e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
2c5f0 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
2c600 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2c610 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2c620 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2c630 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
2c650 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2c660 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
2c670 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2c680 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
2c690 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
2c6a0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2c6b0 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
2c6c0 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
2c6d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c6e0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2c6f0 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
2c700 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
2c710 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
2c720 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
2c730 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
2c740 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
2c750 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
2c770 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
2c780 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
2c790 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2c7b0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2c7c0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2c7d0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
2c7e0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
2c7f0 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
2c800 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2c810 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
2c820 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2c830 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2c840 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2c850 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
2c860 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2c870 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2c880 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2c890 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2c8a0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2c8b0 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
2c8c0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2c8d0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
2c8e0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2c8f0 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
2c900 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
2c910 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
2c920 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
2c930 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2c940 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
2c950 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
2c960 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
2c970 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
2c980 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
2c990 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
2c9a0 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2c9b0 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
2c9c0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
2c9d0 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
2c9e0 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
2c9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ca00 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
2ca10 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
2ca20 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20  name + 1 + nUri 
2ca30 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69  +         /* zFi
2ca40 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
2ca50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20  athname + 8 + 2 
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ca70 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e  zJournal */.#ifn
2ca80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ca90 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e  WAL.    + nPathn
2caa0 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20  ame + 4 + 2     
2cab0 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a         /* zWal *
2cac0 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  /.#endif.  );.  
2cad0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2cae0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
2caf0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
2cb00 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
2cb10 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
2cb20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2cb30 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2cb40 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
2cb50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2cb60 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
2cb70 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
2cb80 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
2cb90 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
2cba0 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
2cbb0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2cbc0 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
2cbd0 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
2cbe0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2cbf0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
2cc00 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
2cc10 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
2cc20 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2cc30 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
2cc40 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
2cc50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
2cc60 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2cc70 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2cc80 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
2cc90 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
2cca0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2ccb0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2ccc0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2ccd0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2cce0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2ccf0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2cd00 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
2cd10 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
2cd20 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
2cd30 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2cd40 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
2cd50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
2cd60 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20  athname>0 );.   
2cd70 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2cd80 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2cd90 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2cda0 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20  + 1 + nUri);.   
2cdb0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2cdc0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2cdd0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2cde0 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
2cdf0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2ce00 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2ce10 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2ce20 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2ce30 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2ce40 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2ce50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2ce60 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2ce70 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2ce80 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2ce90 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c  ", 8+2);.    sql
2cea0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2ceb0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2cec0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2ced0 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2cee0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2cef0 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2cf00 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2cf10 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2cf20 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2cf30 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2cf40 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2cf50 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2cf60 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2cf70 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2cf80 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2cf90 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2cfa0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2cfb0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2cfc0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2cfd0 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2cfe0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2cff0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2d000 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2d010 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2d020 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2d030 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2d040 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2d050 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2d060 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
2d070 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d090 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
2d0a0 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
2d0b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2d0c0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2d0d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2d0e0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
2d0f0 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
2d100 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44     assert( !memD
2d110 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  b );.    readOnl
2d120 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
2d130 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2d140 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2d150 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
2d160 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
2d170 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2d180 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
2d190 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
2d1a0 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
2d1b0 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
2d1c0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2d1d0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
2d1e0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2d1f0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
2d200 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
2d210 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
2d220 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
2d230 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2d240 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
2d250 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
2d260 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
2d270 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
2d280 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
2d290 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
2d2a0 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
2d2b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d2c0 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f  ITE_OK && !readO
2d2d0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74  nly ){.      set
2d2e0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2d2f0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
2d300 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2d310 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
2d320 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2d330 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
2d340 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
2d350 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2d360 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
2d370 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2d380 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2d390 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d3a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a   ){.          sz
2d3b0 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2d3c0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2d3d0 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
2d3e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d3f0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28    szPageDflt = (
2d400 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74  u32)pPager->sect
2d410 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
2d420 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  }.      }.#ifdef
2d430 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2d440 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2d450 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
2d460 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
2d470 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2d480 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
2d490 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  ;.        int ii
2d4a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2d4b0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2d4c0 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
2d4d0 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
2d4e0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2d4f0 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
2d500 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
2d510 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
2d520 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2d530 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
2d540 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
2d550 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
2d560 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2d570 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
2d580 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2){.          if
2d590 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
2d5a0 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
2d5b0 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  8)) ){.         
2d5c0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2d5d0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
2d5e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d5f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
2d600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2d610 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
2d620 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
2d630 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
2d640 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
2d650 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2d660 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
2d670 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2d680 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
2d690 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
2d6a0 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
2d6b0 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2d6c0 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
2d6d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2d6e0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
2d6f0 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
2d700 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2d710 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
2d720 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2d730 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
2d740 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
2d750 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2d760 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
2d770 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
2d780 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
2d790 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
2d7a0 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  / .    tempFile 
2d7b0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2d7c0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
2d7d0 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67  READER;.    pPag
2d7e0 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c  er->eLock = EXCL
2d7f0 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
2d800 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
2d810 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
2d820 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
2d830 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
2d840 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
2d850 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
2d860 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
2d870 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
2d880 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
2d890 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
2d8a0 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
2d8b0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
2d8c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d8d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2d8e0 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
2d8f0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2d900 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
2d910 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
2d920 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
2d930 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2d940 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2d950 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
2d960 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2d970 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
2d980 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
2d990 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ree the .  ** Pa
2d9a0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
2d9b0 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
2d9c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
2d9d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d9e0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2d9f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a  r->pTmpSpace );.
2da00 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2da10 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
2da20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2da30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
2da40 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2da50 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
2da60 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
2da70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45   */.  assert( nE
2da80 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e  xtra<1000 );.  n
2da90 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
2daa0 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65  Extra);.  sqlite
2dab0 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
2dac0 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
2dad0 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
2dae0 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
2daf0 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
2db00 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
2db10 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
2db20 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  e);..  PAGERTRAC
2db30 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
2db40 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
2db50 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
2db60 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2db70 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
2db80 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
2db90 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
2dba0 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
2dbb0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
2dbc0 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
2dbd0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2dbe0 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
2dbf0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2dc00 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
2dc10 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
2dc20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2dc30 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
2dc40 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2dc50 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
2dc60 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2dc70 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
2dc80 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
2dc90 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
2dca0 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
2dcb0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2dcc0 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
2dcd0 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
2dce0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d  pPager->state ==
2dcf0 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47   (tempFile ? PAG
2dd00 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50  ER_EXCLUSIVE : P
2dd10 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a  AGER_UNLOCK) );.
2dd20 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
2dd30 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
2dd40 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
2dd50 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d  mpFile = (u8)tem
2dd60 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
2dd70 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2dd80 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
2dd90 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
2dda0 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
2ddb0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2ddc0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
2ddd0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2dde0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2ddf0 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
2de00 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
2de10 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a   (u8)tempFile; .
2de20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2de30 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
2de40 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2de50 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
2de60 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61  (u8)memDb;.  pPa
2de70 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
2de80 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  (u8)readOnly;.  
2de90 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e  assert( useJourn
2dea0 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  al || pPager->te
2deb0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67  mpFile );.  pPag
2dec0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
2ded0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2dee0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
2def0 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
2df00 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
2df10 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ync==0 );.    as
2df20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79  sert( pPager->sy
2df30 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2df40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2df50 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d  ->walSyncFlags==
2df60 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2df70 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2df80 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d  cFlags==0 );.  }
2df90 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
2dfa0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a  ->fullSync = 1;.
2dfb0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
2dfc0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2dfd0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
2dfe0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2dff0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2e000 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f  NC_NORMAL | WAL_
2e010 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
2e020 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  S;.    pPager->c
2e030 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
2e040 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2e050 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  L;.  }.  /* pPag
2e060 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2e070 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e080 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2e090 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e0a0 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2e0b0 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2e0c0 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2e0d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2e0e0 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2e0f0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2e100 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2e110 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2e120 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2e130 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2e140 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2e150 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2e160 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2e170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2e180 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2e190 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2e1a0 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
2e1b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2e1c0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2e1d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2e1e0 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
2e1f0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
2e200 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
2e210 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
2e220 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
2e230 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
2e240 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
2e250 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
2e260 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
2e270 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
2e280 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  )); */.  /* pPag
2e290 65 72 2d 3e 6d 78 4d 6d 61 70 20 3d 20 53 51 4c  er->mxMmap = SQL
2e2a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
2e2b0 5f 4c 49 4d 49 54 20 2f 2f 20 77 69 6c 6c 20 62  _LIMIT // will b
2e2c0 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63  e set by btree.c
2e2d0 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20   */..  *ppPager 
2e2e0 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
2e2f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2e300 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
2e310 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2e320 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
2e330 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
2e340 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
2e350 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
2e360 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
2e370 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
2e380 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
2e390 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
2e3a0 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
2e3b0 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
2e3c0 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
2e3d0 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
2e3e0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
2e3f0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
2e400 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
2e410 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
2e420 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
2e430 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
2e440 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
2e450 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
2e460 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
2e470 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
2e480 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
2e490 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2e4a0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
2e4b0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
2e4c0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
2e4d0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
2e4e0 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
2e4f0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2e500 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
2e510 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2e520 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
2e530 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e540 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
2e550 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
2e560 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
2e570 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2e580 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
2e590 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
2e5a0 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
2e5b0 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
2e5c0 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
2e5d0 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
2e5e0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
2e5f0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
2e600 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2e610 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2e620 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
2e630 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
2e640 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2e650 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
2e660 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2e670 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
2e680 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
2e690 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
2e6a0 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
2e6b0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
2e6c0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2e6d0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
2e6e0 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
2e6f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2e700 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
2e710 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
2e720 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
2e730 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
2e740 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
2e750 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2e760 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
2e770 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
2e780 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
2e790 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
2e7a0 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
2e7b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2e7c0 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
2e7d0 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
2e7e0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
2e7f0 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
2e800 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
2e810 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
2e820 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2e830 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
2e840 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
2e850 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
2e860 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
2e870 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
2e880 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2e890 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2e8a0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2e8b0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2e8c0 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
2e8d0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
2e8e0 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
2e8f0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
2e900 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
2e910 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2e920 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
2e930 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
2e940 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
2e950 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
2e960 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
2e970 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
2e980 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
2e990 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
2e9a0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
2e9b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e9c0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  K;           /* 
2e9d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2e9e0 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b   int exists = 1;
2e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ea00 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
2ea10 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2ea20 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e  ent */.  int jrn
2ea30 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e  lOpen = !!isOpen
2ea40 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a  (pPager->jfd);..
2ea50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ea60 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
2ea70 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2ea80 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
2ea90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2eaa0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2eab0 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72  OPEN );..  asser
2eac0 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c  t( jrnlOpen==0 |
2ead0 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76  | ( sqlite3OsDev
2eae0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2eaf0 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  cs(pPager->jfd) 
2eb00 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43  &.    SQLITE_IOC
2eb10 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
2eb20 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a  HEN_OPEN.  ));..
2eb30 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
2eb40 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2eb50 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2eb60 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
2eb70 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2eb80 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
2eb90 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
2eba0 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
2ebb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
2ebc0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
2ebd0 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20   locked = 0;    
2ebe0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ebf0 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
2ec00 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2ec10 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
2ec20 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
2ec30 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
2ec40 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
2ec50 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
2ec60 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
2ec70 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
2ec80 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
2ec90 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
2eca0 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
2ecb0 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
2ecc0 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
2ecd0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
2ece0 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
2ecf0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
2ed00 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
2ed10 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
2ed20 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2ed30 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
2ed40 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
2ed50 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
2ed60 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
2ed70 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
2ed80 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
2ed90 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
2eda0 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
2edb0 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
2edc0 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
2edd0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
2ede0 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
2edf0 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
2ee00 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
2ee10 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
2ee20 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
2ee30 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
2ee40 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
2ee50 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2ee60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
2ee70 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  cked ){.      Pg
2ee80 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
2ee90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2eea0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2eeb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2eec0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
2eed0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
2eee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2eef0 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  If it consists o
2ef00 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20  f 0 pages,.     
2ef10 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20   ** then delete 
2ef20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ef30 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  . See the header
2ef40 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66   comment above f
2ef50 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  or .      ** the
2ef60 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e   reasoning here.
2ef70 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73    Delete the obs
2ef80 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
2ef90 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a  le under.      *
2efa0 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * a RESERVED loc
2efb0 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20  k to avoid race 
2efc0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74  conditions and t
2efd0 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e  o avoid violatin
2efe0 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30  g.      ** [H330
2eff0 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  20]..      */.  
2f000 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
2f010 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
2f020 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
2f030 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f040 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2f050 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
2f060 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
2f070 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
2f080 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f090 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
2f0a0 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
2f0b0 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  K)==SQLITE_OK ){
2f0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2f0d0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
2f0e0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2f0f0 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nal, 0);.       
2f100 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
2f110 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2f120 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  ) pagerUnlockDb(
2f130 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
2f140 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
2f150 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
2f160 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
2f170 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oc();.        }e
2f180 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2f190 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2f1a0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f  le exists and no
2f1b0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2f1c0 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64  n has a reserved
2f1d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
2f1e0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
2f1f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f200 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68  le. Now check th
2f210 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  at there is.    
2f220 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73        ** at leas
2f230 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62  t one non-zero b
2f240 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72  ytes at the star
2f250 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
2f260 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
2f270 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c   ** If there is,
2f280 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65   then we conside
2f290 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74  r this journal t
2f2a0 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74  o be hot. If not
2f2b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
2f2c0 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  it can be ignore
2f2d0 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d..          */.
2f2e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
2f2f0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
2f300 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
2f310 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2f320 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
2f330 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
2f340 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2f350 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2f360 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2f370 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
2f380 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
2f390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f3a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f3b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2f3c0 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
2f3d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2f3e0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
2f3f0 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
2f400 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
2f410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2f420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
2f430 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
2f440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2f450 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f460 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2f470 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
2f480 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
2f490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
2f4a0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
2f4b0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
2f4c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
2f4d0 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74  pExists = (first
2f4e0 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
2f4f0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2f500 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
2f510 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2f520 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65  If we cannot ope
2f530 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
2f540 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f  ournal file in o
2f550 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20  rder to see if. 
2f560 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
2f570 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61  s has a zero hea
2f580 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20  der, that might 
2f590 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f  be due to an I/O
2f5a0 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20   error, or.     
2f5b0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67         ** it mig
2f5c0 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65  ht be due to the
2f5d0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
2f5e0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
2f5f0 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20  and in.         
2f600 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38     ** ticket #38
2f610 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  83.  Either way,
2f620 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
2f630 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
2f640 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2f650 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20  This might be a 
2f660 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20  false positive. 
2f670 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74   But if it is, t
2f680 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
2f690 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
2f6a0 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
2f6b0 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d  k and recovery m
2f6c0 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65  echanism will de
2f6d0 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  al.            *
2f6e0 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20  * with it under 
2f6f0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2f700 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  k where we do no
2f710 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  t need to.      
2f720 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73        ** worry s
2f730 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65  o much with race
2f740 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20   conditions..   
2f750 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2f760 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
2f770 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2f780 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2f790 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f7b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
2f7c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f7d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f7e0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
2f7f0 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
2f800 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2f810 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
2f820 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
2f830 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
2f840 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65  ire() until afte
2f850 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
2f860 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
2f870 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
2f880 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
2f890 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
2f8a0 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
2f8b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2f8c0 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
2f8d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
2f8e0 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
2f8f0 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
2f900 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
2f910 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
2f920 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2f930 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
2f940 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28  GER_OPEN state (
2f950 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
2f960 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
2f970 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
2f980 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
2f990 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
2f9a0 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
2f9b0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2f9c0 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
2f9d0 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
2f9e0 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
2f9f0 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
2fa00 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
2fa10 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
2fa20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
2fa30 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
2fa40 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
2fa50 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
2fa60 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
2fa70 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
2fa80 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
2fa90 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
2faa0 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
2fab0 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
2fac0 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
2fad0 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
2fae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
2faf0 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
2fb00 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
2fb10 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
2fb20 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
2fb30 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
2fb40 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
2fb50 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
2fb60 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
2fb70 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
2fb80 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
2fb90 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
2fba0 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
2fbb0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
2fbc0 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
2fbd0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
2fbe0 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
2fbf0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
2fc00 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
2fc10 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
2fc20 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
2fc30 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
2fc40 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
2fc50 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
2fc60 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
2fc70 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2fc80 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
2fc90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2fca0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
2fcb0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
2fcc0 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
2fcd0 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
2fce0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
2fcf0 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69  ile or .** rolli
2fd00 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
2fd10 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
2fd20 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2fd30 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
2fd40 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
2fd50 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
2fd60 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2fd70 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2fd80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2fd90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
2fda0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2fdb0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
2fdc0 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
2fdd0 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
2fde0 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
2fdf0 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  nding pages. Thi
2fe00 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
2fe10 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73  he pager state s
2fe20 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a  hould either.  *
2fe30 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41  * be OPEN or REA
2fe40 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f  DER. READER is o
2fe50 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
2fe60 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20  the pager is or 
2fe70 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63  was in .  ** exc
2fe80 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
2fe90 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
2fea0 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
2feb0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
2fec0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
2fed0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
2fee0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
2fef0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
2ff00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2ff10 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
2ff20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2ff30 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
2ff40 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44    if( NEVER(MEMD
2ff50 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  B && pPager->err
2ff60 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20  Code) ){ return 
2ff70 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2ff80 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72   }..  if( !pager
2ff90 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
2ffa0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
2ffb0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  ==PAGER_OPEN ){.
2ffc0 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72      int bHotJour
2ffd0 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20  nal = 1;        
2ffe0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2fff0 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20  re exists a hot 
30000 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a  journal-file */.
30010 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
30020 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d  MDB );..    rc =
30030 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
30040 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
30050 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
30060 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30070 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
30080 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
30090 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  NO_LOCK || pPage
300a0 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
300b0 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
300c0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
300d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
300e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
300f0 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
30100 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
30110 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
30120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
30130 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
30140 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
30150 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
30160 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
30170 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
30180 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
30190 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
301a0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
301b0 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a   &bHotJournal);.
301c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
301d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
301e0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
301f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30200 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  bHotJournal ){. 
30210 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
30220 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
30230 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30240 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
30250 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  CK;.        goto
30260 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
30270 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  ..      /* Get a
30280 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
30290 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
302a0 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
302b0 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
302c0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
302d0 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
302e0 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
302f0 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
30300 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
30310 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
30320 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
30330 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
30340 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
30350 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
30360 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
30370 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
30380 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
30390 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
303a0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
303b0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
303c0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
303d0 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
303e0 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
303f0 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
30400 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
30410 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
30420 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
30430 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
30440 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
30450 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
30460 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
30470 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
30480 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
30490 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
304a0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
304b0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
304c0 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
304d0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
304e0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
304f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
30500 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
30510 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
30520 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  s in locking_mod
30530 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
30540 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20  , the lock is.  
30550 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65      ** downgrade
30560 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b  d to SHARED_LOCK
30570 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
30580 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20  ction returns.. 
30590 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
305a0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
305b0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
305c0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
305d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
305e0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
305f0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
30600 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74   .      /* If it
30610 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
30620 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c  open and the fil
30630 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  e exists on disk
30640 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20  , open the .    
30650 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72    ** journal for
30660 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
30670 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73  ss. Write access
30680 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
30690 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  ause .      ** i
306a0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
306b0 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
306c0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
306d0 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20   be kept open . 
306e0 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73       ** and poss
306f0 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
30700 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
30710 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74  r on. Also, writ
30720 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20  e-access .      
30730 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65  ** is usually re
30740 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69  quired to finali
30750 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ze the journal i
30760 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70  n journal_mode=p
30770 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  ersist .      **
30780 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20   mode (and also 
30790 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  for journal_mode
307a0 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d  =truncate on som
307b0 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20  e systems)..    
307c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
307d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
307e0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20  s not exist, it 
307f0 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68  usually means th
30800 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a  at some .      *
30810 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
30820 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
30830 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
30840 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
30850 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e      ** this conn
30860 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20  ection obtained 
30870 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
30880 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74  ck above. Or, it
30890 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d   .      ** may m
308a0 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67  ean that the pag
308b0 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72  er was in the er
308c0 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
308d0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
308e0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
308f0 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
30900 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
30910 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
30920 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
30930 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
30940 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30950 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
30960 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
30970 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45  ;.        int bE
30980 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20  xists;          
30990 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
309a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
309b0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ts */.        rc
309c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
309d0 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss(.            
309e0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
309f0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
30a00 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62  CCESS_EXISTS, &b
30a10 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20  Exists);.       
30a20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30a30 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b  OK && bExists ){
30a40 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
30a50 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
30a60 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
30a70 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
30a80 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
30a90 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
30aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
30ab0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
30ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
30ad0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
30ae0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
30af0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
30b00 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
30b10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
30b20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
30b30 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
30b40 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
30b50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30b60 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
30b70 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
30b80 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
30b90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
30ba0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
30bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
30bc0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
30bd0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  fd);.          }
30be0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30bf0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c   }. .      /* Pl
30c00 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
30c10 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
30c20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
30c30 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
30c40 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
30c50 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
30c60 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
30c70 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
30c80 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
30c90 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
30ca0 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
30cb0 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
30cc0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
30cd0 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
30ce0 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
30cf0 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
30d00 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
30d10 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
30d20 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
30d30 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
30d40 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
30d50 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
30d60 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
30d70 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
30d80 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
30d90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
30da0 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
30db0 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
30dc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
30dd0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
30de0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  fd) ){.        a
30df0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
30e00 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
30e10 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  rc = pagerSyncHo
30e20 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
30e30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30e40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30e50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
30e60 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
30e70 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ger, 1);.       
30e80 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
30e90 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
30ea0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30eb0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
30ec0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
30ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
30ee0 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
30ef0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
30f00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
30f10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30f20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
30f30 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
30f40 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ken if an error 
30f50 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
30f60 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20  ing to open.    
30f70 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62      ** or roll b
30f80 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
30f90 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  l while holding 
30fa0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
30fb0 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  k. The.        *
30fc0 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
30fd0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
30fe0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
30ff0 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f  eturning to unlo
31000 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ck.        ** th
31010 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75  e file. If the u
31020 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61  nlock attempt fa
31030 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ils, then Pager.
31040 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20  eLock must be.  
31050 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
31060 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65  UNKNOWN_LOCK (se
31070 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
31080 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
31090 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  for .        ** 
310a0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f  UNKNOWN_LOCK abo
310b0 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  ve for an explan
310c0 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20  ation). .       
310d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
310e0 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70  n order to get p
310f0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f  ager_unlock() to
31100 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61   do this, set Pa
31110 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20  ger.eState to.  
31120 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45        ** PAGER_E
31130 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69  RROR now. This i
31140 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  s not actually c
31150 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e  ounted as a tran
31160 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  sition.        *
31170 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  * to ERROR state
31180 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69   in the state di
31190 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70  agram at the top
311a0 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20   of this file,. 
311b0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20         ** since 
311c0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
311d0 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61   same call to pa
311e0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
311f0 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a  l very.        *
31200 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69  * shortly transi
31210 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f  tion the pager o
31220 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45  bject to the OPE
31230 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67  N state. Calling
31240 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65  .        ** asse
31250 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
31260 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c   would fail now,
31270 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f   as it should no
31280 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20  t be possible.  
31290 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
312a0 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
312b0 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72  en there are zer
312c0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
312d0 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ge .        ** r
312e0 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20  eferences..     
312f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61     */.        pa
31300 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
31310 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67  , rc);.        g
31320 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31330 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
31340 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
31350 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
31360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
31370 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53  pPager->eLock==S
31380 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
31390 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
313a0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
313b0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
313c0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  k>SHARED_LOCK). 
313d0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
313e0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
313f0 74 65 6d 70 46 69 6c 65 20 26 26 20 28 0a 20 20  tempFile && (.  
31400 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
31410 61 63 6b 75 70 20 0a 20 20 20 20 20 7c 7c 20 73  ackup .     || s
31420 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
31430 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
31440 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20 7c  Cache)>0 .     |
31450 7c 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65  | pPager->bUseFe
31460 74 63 68 0a 20 20 20 20 29 29 7b 0a 20 20 20 20  tch.    )){.    
31470 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
31480 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
31490 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
314a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
314b0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
314c0 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
314d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
314e0 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
314f0 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
31500 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
31510 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
31520 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
31530 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
31540 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
31550 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
31560 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
31570 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
31580 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
31590 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
315a0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
315b0 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
315c0 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
315d0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
315e0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
315f0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
31600 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
31610 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
31620 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
31630 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
31640 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
31650 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
31660 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
31670 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
31680 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
31690 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
316a0 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
316b0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
316c0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
316d0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
316e0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
316f0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
31700 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
31710 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
31720 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
31730 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
31740 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
31750 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
31760 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
31770 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
31780 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
31790 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
317a0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
317b0 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
317c0 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
317d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
317e0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
317f0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
31800 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
31810 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
31820 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
31830 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
31840 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
31850 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
31860 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
31870 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31880 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
31890 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
318a0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
318b0 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
318c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
318d0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
318e0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
318f0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
31900 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
31920 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
31930 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
31940 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
31950 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
31960 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
31970 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
31980 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
31990 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
319a0 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
319b0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
319c0 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
319d0 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61   /* Unmap the da
319e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
319f0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
31a00 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
31a10 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
31a20 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65  ay have truncate
31a30 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
31a40 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74  ile and then ext
31a50 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20  ended it back.  
31a60 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20        ** to its 
31a70 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68  original size wh
31a80 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
31a90 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67   was not holding
31aa0 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20   a lock..       
31ab0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
31ac0 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74   there may exist
31ad0 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61   a Pager.pMap ma
31ae0 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61  pping that appea
31af0 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  rs.        ** to
31b00 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69   be the right si
31b10 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63  ze but is not ac
31b20 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76  tually valid. Av
31b30 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20  oid this.       
31b40 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20   ** possibility 
31b50 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65  by unmapping the
31b60 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20   db here. */.   
31b70 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
31b80 3e 62 55 73 65 46 65 74 63 68 20 29 7b 0a 20 20  >bUseFetch ){.  
31b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
31ba0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
31bb0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
31bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31bd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
31be0 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
31bf0 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
31c00 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
31c10 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
31c20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
31c30 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
31c40 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
31c50 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
31c60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
31c70 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
31c80 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
31c90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31ca0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
31cb0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
31cc0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
31cd0 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
31ce0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
31cf0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
31d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
31d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
31d20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
31d30 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
31d40 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
31d50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
31d60 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
31d70 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
31d80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
31d90 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
31da0 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53  er, &pPager->dbS
31db0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c  ize);.  }.. fail
31dc0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
31dd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
31de0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
31df0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
31e00 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  k(pPager);.    a
31e10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31e20 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
31e30 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  N );.  }else{.  
31e40 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
31e50 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
31e60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
31e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
31e80 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
31e90 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
31ea0 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
31eb0 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
31ec0 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
31ed0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
31ee0 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
31ef0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
31f00 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
31f10 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
31f20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
31f30 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
31f40 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
31f50 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
31f60 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
31f70 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
31f80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
31f90 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
31fa0 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
31fb0 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
31fc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
31fd0 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
31fe0 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33  t==0 && (sqlite3
31ff0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
32000 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
32010 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72  =0) ){.    pager
32020 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
32030 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
32040 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
32050 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
32060 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  age number pgno 
32070 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20  in pager pPager 
32080 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72  (a page.** refer
32090 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62  ence has type Db
320a0 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72  Page*). If the r
320b0 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
320c0 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
320d0 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
320e0 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
320f0 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
32100 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
32110 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
32120 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
32130 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
32140 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
32150 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
32160 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
32170 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
32180 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
32190 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
321a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
321b0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
321c0 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
321d0 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
321e0 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
321f0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
32200 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
32210 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
32220 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
32230 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
32240 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
32250 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
32260 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
32270 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
32280 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
32290 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
322a0 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
322b0 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
322c0 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
322d0 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
322e0 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
322f0 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
32300 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
32310 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
32320 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
32330 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
32340 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
32350 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
32360 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
32370 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
32380 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
32390 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
323a0 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
323b0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
323c0 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
323d0 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
323e0 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
323f0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
32400 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
32410 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
32420 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
32430 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
32440 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
32450 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
32460 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
32470 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
32480 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
32490 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
324a0 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
324b0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
324c0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
324d0 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
324e0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
324f0 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
32500 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65  two seperate sce
32510 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
32520 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
32530 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
32540 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
32550 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
32560 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
32570 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
32580 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
32590 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
325a0 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
325b0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
325c0 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  che to be filled
325d0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72   with the data r
325e0 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
325f0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a   the savepoint j
32600 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
32610 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
32620 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
32630 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65  a returned is ze
32640 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  roed instead of.
32650 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72  ** being read fr
32660 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
32670 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
32680 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f  he bits correspo
32690 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f  nding.** to pgno
326a0 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
326b0 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20  rnal (bitvec of 
326c0 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72  pages already wr
326d0 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
326e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
326f0 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
32700 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
32710 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79  t bitvecs of any
32720 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69   open.** savepoi
32730 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  nts are set. Thi
32740 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70  s means if the p
32750 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  age is made writ
32760 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70  able at any.** p
32770 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
32780 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  re, using a call
32790 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
327a0 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e  Write(), its con
327b0 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  tents.** will no
327c0 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  t be journaled. 
327d0 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a  This saves IO..*
327e0 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
327f0 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
32800 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
32810 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
32820 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
32830 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
32840 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
32850 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
32860 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
32870 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
32880 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
32890 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
328a0 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
328b0 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
328c0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
328d0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
328e0 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
328f0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
32900 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
32910 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
32920 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
32930 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
32940 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
32950 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
32960 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
32970 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
32980 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
32990 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
329a0 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
329b0 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
329c0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
329d0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
329e0 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
329f0 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
32a00 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
32a10 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
32a20 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
32a30 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
32a40 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
32a50 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
32a60 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
32a70 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
32a80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
32a90 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
32aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
32ab0 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
32ac0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
32ad0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
32ae0 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
32af0 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
32b00 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
32b10 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
32b20 41 43 51 55 49 52 45 5f 58 58 58 20 66 6c 61 67  ACQUIRE_XXX flag
32b30 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
32b40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
32b50 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
32b60 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
32b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32b80 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65    /* Frame to re
32b90 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65  ad from WAL file
32ba0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
32bb0 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61  noContent = (fla
32bc0 67 73 20 26 20 50 41 47 45 52 5f 41 43 51 55 49  gs & PAGER_ACQUI
32bd0 52 45 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a  RE_NOCONTENT);..
32be0 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70    /* It is accep
32bf0 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72  table to use a r
32c00 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20  ead-only (mmap) 
32c10 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67  page for any pag
32c20 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61  e except.  ** pa
32c30 67 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73  ge 1 if there is
32c40 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
32c50 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68  ction open or th
32c60 65 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e  e ACQUIRE_READON
32c70 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73  LY.  ** flag was
32c80 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
32c90 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f  e caller. And so
32ca0 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20   long as the db 
32cb0 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74  is not a .  ** t
32cc0 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
32cd0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
32ce0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
32cf0 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21  bMmapOk = (pgno!
32d00 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 62 55  =1 && pPager->bU
32d10 73 65 46 65 74 63 68 0a 20 20 20 26 26 20 28 70  seFetch.   && (p
32d20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32d30 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28  AGER_READER || (
32d40 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 41 43  flags & PAGER_AC
32d50 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 29 29  QUIRE_READONLY))
32d60 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  );..  assert(
32d70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
32d80 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
32d90 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
32da0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
32db0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
32dc0 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20  t( noContent==0 
32dd0 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b  || bMmapOk==0 );
32de0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ..  if( pgno==0 
32df0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32e00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
32e10 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
32e20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
32e30 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
32e40 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
32e50 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20   immediately. . 
32e60 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72   ** Otherwise, r
32e70 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20  equest the page 
32e80 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20  from the PCache 
32e90 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20  layer. */.  if( 
32ea0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
32eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32ec0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
32ed0 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  rrCode;.  }else{
32ee0 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f  ..    if( bMmapO
32ef0 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  k && pagerUseWal
32f00 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
32f10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
32f20 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
32f30 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
32f40 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
32f50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32f60 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
32f70 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
32f80 0a 0a 20 20 20 20 69 66 28 20 69 46 72 61 6d 65  ..    if( iFrame
32f90 3d 3d 30 20 26 26 20 62 4d 6d 61 70 4f 6b 20 29  ==0 && bMmapOk )
32fa0 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
32fb0 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ata = 0;..      
32fc0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65  rc = sqlite3OsFe
32fd0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
32fe0 0a 20 20 20 20 20 20 20 20 20 20 28 69 36 34 29  .          (i64)
32ff0 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
33000 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
33010 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26  ger->pageSize, &
33020 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a  pData.      );..
33030 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33040 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
33050 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
33060 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
33070 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20  AGER_READER ){. 
33080 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73           (void)s
33090 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
330a0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
330b0 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67  e, pgno, 0, &pPg
330c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
330d0 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
330e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
330f0 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  = pagerAcquireMa
33100 70 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 67  pPage(pPager, pg
33110 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29  no, pData, &pPg)
33120 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
33130 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
33140 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
33150 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67  er->fd, (i64)(pg
33160 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61  no-1)*pPager->pa
33170 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a  geSize, pData);.
33180 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33190 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
331a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
331b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
331c0 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67            *ppPag
331d0 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20  e = pPg;.       
331e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
331f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
33200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
33210 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33220 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
33230 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
33240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
33250 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33260 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
33270 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
33280 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a  no, 1, ppPage);.
33290 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
332a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
332b0 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61  /* Either the ca
332c0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61  ll to sqlite3Pca
332d0 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72  cheFetch() retur
332e0 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20  ned an error or 
332f0 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
33300 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20   was already in 
33310 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
33320 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
33330 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  on was called.. 
33340 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f     ** Set pPg to
33350 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74   0 and jump to t
33360 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e  he exception han
33370 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50  dler.  */.    pP
33380 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  g = 0;.    goto 
33390 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
333a0 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
333b0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
333c0 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
333d0 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
333e0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c  Pager==pPager ||
333f0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
33400 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  er==0 );..  if( 
33410 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
33420 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20  r && !noContent 
33430 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
33440 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68  s case the pcach
33450 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
33460 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  ns an initialize
33470 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a  d copy of.    **
33480 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72   the page. Retur
33490 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65  n without furthe
334a0 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61  r ado.  */.    a
334b0 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47  ssert( pgno<=PAG
334c0 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70  ER_MAX_PGNO && p
334d0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
334e0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
334f0 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
33500 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b  PAGER_STAT_HIT]+
33510 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  +;.    return SQ
33520 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73  LITE_OK;..  }els
33530 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e{.    /* The pa
33540 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
33550 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
33560 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
33570 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
33580 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
33590 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a 70  */..    pPg = *p
335a0 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e  pPage;.    pPg->
335b0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
335c0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
335d0 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
335e0 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
335f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
33600 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a  if a page.    **
33610 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
33620 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68  than this, or th
33630 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67  e unused locking
33640 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73  -page, is reques
33650 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
33660 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
33670 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
33680 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
33690 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
336a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
336b0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
336c0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
336d0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
336e0 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67  f( MEMDB || pPag
336f0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20  er->dbSize<pgno 
33700 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20  || noContent || 
33710 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
33720 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
33730 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
33740 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
33750 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
33760 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
33770 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
33780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33790 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
337a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
337b0 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
337c0 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
337d0 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
337e0 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
337f0 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
33800 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
33810 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
33820 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
33830 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
33840 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
33850 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
33860 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
33870 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
33880 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
33890 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
338a0 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
338b0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
338c0 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
338d0 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
338e0 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
338f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
33900 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
33910 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
33920 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
33930 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
33940 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
33950 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
33960 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
33970 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
33980 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
33990 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
339a0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
339b0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
339c0 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
339d0 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
339e0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
339f0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
33a00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
33a10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
33a20 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
33a30 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
33a40 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
33a50 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
33a60 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
33a70 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
33a80 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
33a90 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
33aa0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
33ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
33ac0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
33ad0 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b  ager) && bMmapOk
33ae0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
33af0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
33b00 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
33b10 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
33b20 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
33b30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33b40 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
33b50 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
33b60 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
33b70 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
33b80 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ger );.      pPa
33b90 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
33ba0 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20  _STAT_MISS]++;. 
33bb0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
33bc0 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65  Page(pPg, iFrame
33bd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
33be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33bf0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
33c00 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
33c10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
33c20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
33c30 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  sh(pPg);.  }..  
33c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33c50 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65  ;..pager_acquire
33c60 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20  _err:.  assert( 
33c70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
33c80 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
33c90 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
33ca0 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rop(pPg);.  }.  
33cb0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
33cc0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  sed(pPager);..  
33cd0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  *ppPage = 0;.  r
33ce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33cf0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
33d00 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
33d10 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
33d20 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
33d30 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
33d40 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
33d50 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
33d60 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
33d70 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
33d80 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
33d90 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  e. .**.** See al
33da0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
33db0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
33dc0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
33dd0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
33de0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
33df0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
33e00 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
33e10 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
33e20 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
33e30 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
33e40 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
33e50 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
33e60 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
33e70 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
33e80 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
33e90 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
33ea0 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
33eb0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
33ec0 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
33ed0 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
33ee0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
33ef0 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
33f00 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  g = 0;.  assert(
33f10 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
33f20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
33f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
33f40 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20  ger->pPCache!=0 
33f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
33f60 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
33f70 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
33f80 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
33f90 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71  ER_ERROR );.  sq
33fa0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
33fb0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
33fc0 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29  , pgno, 0, &pPg)
33fd0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ;.  return pPg;.
33fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
33ff0 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
34000 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
34010 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
34020 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
34030 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
34040 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
34050 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
34060 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
34070 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
34080 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
34090 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
340a0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
340b0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
340c0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
340d0 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f  * removed..*/.vo
340e0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
340f0 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
34100 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  ){.  if( pPg ){.
34110 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
34120 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
34130 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
34140 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
34150 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 52   ){.      pagerR
34160 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50  eleaseMapPage(pP
34170 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
34180 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
34190 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
341a0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
341b0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
341c0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
341d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
341e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74  n is called at t
341f0 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72  he start of ever
34200 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  y write transact
34210 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ion..** There mu
34220 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  st already be a 
34230 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
34240 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
34250 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
34260 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
34270 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
34280 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  .**.** Open the 
34290 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
342a0 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e   pager pPager an
342b0 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61  d write a journa
342c0 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74  l header.** to t
342d0 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20  he start of it. 
342e0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
342f0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20  ive savepoints, 
34300 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  open the sub-jou
34310 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e  rnal.** as well.
34320 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
34330 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
34340 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34350 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f  e is being .** o
34360 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61  pened to write a
34370 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f   rollback log fo
34380 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  r a transaction.
34390 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   It is not used 
343a0 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  .** when opening
343b0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66   a hot journal f
343c0 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ile to roll it b
343d0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
343e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
343f0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28  s already open (
34400 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  as it may be in 
34410 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c  exclusive mode),
34420 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75  .** then this fu
34430 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74  nction just writ
34440 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  es a journal hea
34450 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  der to the start
34460 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61   of the.** alrea
34470 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a  dy open file. .*
34480 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
34490 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
344a0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62  file is opened b
344b0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  y this function,
344c0 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49   the.** Pager.pI
344d0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
344e0 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
344f0 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ocated..**.** Re
34500 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
34510 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
34520 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65  successful. Othe
34530 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a  rwise, return .*
34540 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
34550 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
34560 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e   allocate Pager.
34570 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  pInJournal fails
34580 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65  , or .** an IO e
34590 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65  rror code if ope
345a0 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ning or writing 
345b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
345c0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
345d0 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
345e0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
345f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
34600 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
34610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34620 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
34630 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
34640 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
34650 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
34660 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
34670 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
34680 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
34690 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
346a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
346b0 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CKED );.  assert
346c0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
346d0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
346e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
346f0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
34700 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c  );.  .  /* If al
34710 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
34720 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  or state, this f
34730 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
34740 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a  op.  But on.  **
34750 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
34760 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
34770 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66   never called if
34780 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
34790 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  in.  ** an error
347a0 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28   state. */.  if(
347b0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
347c0 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
347d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
347e0 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  ;..  if( !pagerU
347f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
34800 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
34810 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
34820 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
34830 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
34840 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
34850 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
34860 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
34870 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
34880 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
34890 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
348a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
348b0 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68   .    /* Open th
348c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
348d0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
348e0 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20  ady open. */.   
348f0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
34900 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
34910 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
34920 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
34930 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
34940 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  MORY ){.        
34950 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
34960 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
34970 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
34980 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
34990 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20  nt flags =      
349a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
349b0 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  VFS flags to ope
349c0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
349d0 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  /.          SQLI
349e0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
349f0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
34a00 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
34a10 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  (pPager->tempFil
34a20 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  e ? .           
34a30 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
34a40 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
34a50 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
34a60 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20  RNAL):.         
34a70 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
34a80 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20  MAIN_JOURNAL).  
34a90 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66          );.  #if
34aa0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
34ab0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
34ac0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34ad0 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
34ae0 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
34af0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
34b00 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
34b10 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
34b20 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
34b30 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73         );.  #els
34b40 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  e.        rc = s
34b50 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
34b60 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
34b70 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
34b80 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23  , flags, 0);.  #
34b90 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
34ba0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
34bb0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
34bc0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
34bd0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a   );.    }.  .  .
34be0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
34bf0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
34c00 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
34c10 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
34c20 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
34c30 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
34c40 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
34c50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
34c70 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
34c80 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
34c90 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
34ca0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  d. */.      pPag
34cb0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
34cc0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
34cd0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
34ce0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
34cf0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
34d00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
34d10 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
34d20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
34d30 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
34d40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
34d50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34d60 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
34d70 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
34d80 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
34d90 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
34da0 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  l = 0;.  }else{.
34db0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
34dc0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
34dd0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
34de0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
34df0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
34e00 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20  ITER_CACHEMOD;. 
34e10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
34e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
34e30 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
34e40 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
34e50 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
34e60 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
34e70 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
34e80 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
34e90 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
34ea0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
34eb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
34ec0 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
34ed0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
34ee0 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
34ef0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
34f00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34f10 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
34f20 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
34f30 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
34f40 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
34f50 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
34f60 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
34f70 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
34f80 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
34f90 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
34fa0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a  *.** If the subj
34fb0 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
34fc0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
34fd0 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72  hen any sub-jour
34fe0 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69  nal opened.** wi
34ff0 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
35000 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70  ction will be op
35010 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
35020 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a  mory file. This.
35030 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ** has no effect
35040 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   if the sub-jour
35050 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f  nal is already o
35060 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79  pened (as it may
35070 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e   be when.** runn
35080 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
35090 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65   mode) or if the
350a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65   transaction doe
350b0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  s not require a.
350c0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ** sub-journal. 
350d0 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
350e0 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
350f0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72  zero, then any r
35100 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a  equired.** sub-j
35110 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d  ournal is implem
35120 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  ented in-memory 
35130 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20  if pPager is an 
35140 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
35150 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67  se, .** or using
35160 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
35170 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
35180 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
35190 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
351a0 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c  ger, int exFlag,
351b0 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   int subjInMemor
351c0 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  y){.  int rc = S
351d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
351e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
351f0 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
35200 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73  ->errCode;.  ass
35210 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35220 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
35230 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
35240 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20  ate<PAGER_ERROR 
35250 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
35260 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
35270 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20  subjInMemory;.. 
35280 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67   if( ALWAYS(pPag
35290 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
352a0 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20  R_READER) ){.   
352b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
352c0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
352d0 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
352e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
352f0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
35300 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
35310 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
35320 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
35330 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
35340 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
35350 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
35360 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
35370 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
35380 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
35390 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
353a0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
353b0 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
353c0 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
353d0 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
353e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
353f0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
35400 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
35410 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
35420 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35430 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
35440 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
35450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
35460 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
35470 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b  Pager->pWal, 1);
35480 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
35490 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74  /* Grab the writ
354a0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f  e lock on the lo
354b0 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  g file. If succe
354c0 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74  ssful, upgrade t
354d0 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52  o.      ** PAGER
354e0 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
354f0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
35500 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
35510 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
35520 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73        ** The bus
35530 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74  y-handler is not
35540 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74   invoked if anot
35550 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  her connection a
35560 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20  lready.      ** 
35570 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d  holds the write-
35580 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c  lock. If possibl
35590 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  e, the upper lay
355a0 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e  er will call it.
355b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
355c0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
355d0 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
355e0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
355f0 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
35600 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61       /* Obtain a
35610 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
35620 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
35630 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
35640 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
35650 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74     ** is true, t
35660 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hen immediately 
35670 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20  upgrade this to 
35680 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
35690 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  k. The.      ** 
356a0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
356b0 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65  lback can be use
356c0 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  d when upgrading
356d0 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56   to the EXCLUSIV
356e0 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c  E.      ** lock,
356f0 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62   but not when ob
35700 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45  taining the RESE
35710 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  RVED lock..     
35720 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
35730 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
35740 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
35750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
35760 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
35770 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
35780 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
35790 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
357a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
357b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
357c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
357d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
357e0 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54  * Change to WRIT
357f0 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e  ER_LOCKED state.
35800 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
35810 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73  ** WAL mode sets
35820 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
35830 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
35840 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44  CKED or CACHEMOD
35850 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69  .      ** when i
35860 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72  t has an open tr
35870 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e  ansaction, but n
35880 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72  ever to DBMOD or
35890 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20   FINISHED..     
358a0 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
358b0 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61  use in those sta
358c0 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
358d0 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f  roll back savepo
358e0 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
358f0 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63  ansactions may c
35900 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
35910 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e  e sub-journal in
35920 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
35930 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
35940 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74  s well as into t
35950 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57  he page cache. W
35960 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e  hich would be in
35970 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20  correct in .    
35980 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20    ** WAL mode.. 
35990 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
359a0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
359b0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
359c0 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ED;.      pPager
359d0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
359e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
359f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
35a00 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ileSize = pPager
35a10 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
35a20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
35a30 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
35a40 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
35a50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
35a60 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  0;.    }..    as
35a70 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
35a80 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
35a90 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
35aa0 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72  DER );.    asser
35ab0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
35ac0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
35ad0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
35ae0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61  _LOCKED );.    a
35af0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
35b00 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
35b10 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  ) );.  }..  PAGE
35b20 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43  RTRACE(("TRANSAC
35b30 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
35b40 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
35b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
35b60 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67  *.** Mark a sing
35b70 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20  le data page as 
35b80 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70  writeable. The p
35b90 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
35ba0 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  nto the .** main
35bb0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
35bc0 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69  journal as requi
35bd0 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  red. If the page
35be0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
35bf0 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a  .** one of the j
35c00 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72  ournals, the cor
35c10 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
35c20 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a  s set in the .**
35c30 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
35c40 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65  l bitvec and the
35c50 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
35c60 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
35c70 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f  vecs.** of any o
35c80 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61  pen savepoints a
35c90 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
35ca0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
35cb0 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
35cc0 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
35cd0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
35ce0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
35cf0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
35d00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35d10 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
35d20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
35d30 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
35d40 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
35d50 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a  on has already .
35d60 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65    ** been starte
35d70 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d. The journal f
35d80 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ile may or may n
35d90 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68  ot be open at th
35da0 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49  is point..  ** I
35db0 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  t is never calle
35dc0 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  d in the ERROR s
35dd0 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tate..  */.  ass
35de0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35df0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
35e00 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
35e10 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
35e20 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
35e30 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
35e40 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
35e50 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
35e60 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
35e70 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
35e80 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
35e90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  );..  /* If an e
35ea0 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
35eb0 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65  eviously detecte
35ec0 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73 61  d, report the sa
35ed0 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67  me error.  ** ag
35ee0 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ain. This should
35ef0 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74   not happen, but
35f00 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69   the check provi
35f10 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20  des robustness. 
35f20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
35f30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
35f40 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  )  return pPager
35f50 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
35f60 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f   Higher-level ro
35f70 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c  utines never cal
35f80 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
35f90 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  if database is n
35fa0 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65  ot.  ** writable
35fb0 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79  .  But check any
35fc0 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f  way, just for ro
35fd0 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69  bustness. */.  i
35fe0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
35ff0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74  >readOnly) ) ret
36000 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
36010 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
36020 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  Pg);..  /* The j
36030 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
36040 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20  s to be opened. 
36050 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75  Higher level rou
36060 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61  tines have alrea
36070 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  dy.  ** obtained
36080 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c   the necessary l
36090 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68  ocks to begin th
360a0 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
360b0 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a  ion, but the.  *
360c0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
360d0 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74  al might not yet
360e0 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69   be open. Open i
360f0 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73  t now if this is
36100 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a   the case..  **.
36110 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e    ** This is don
36120 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
36130 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
36140 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65  keDirty() on the
36150 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68   page. .  ** Oth
36160 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65  erwise, if it we
36170 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61  re done after ca
36180 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
36190 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20  cheMakeDirty(), 
361a0 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  then.  ** an err
361b0 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61  or might occur a
361c0 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75  nd the pager wou
361d0 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49  ld end up in WRI
361e0 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
361f0 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73  .  ** with pages
36200 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
36210 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20   in the cache.. 
36220 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
36230 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36240 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
36250 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
36260 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
36270 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
36280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
36290 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
362a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
362b0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
362c0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
362d0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
362e0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
362f0 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ger) );..  /* Ma
36300 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
36310 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
36320 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
36330 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
36340 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
36350 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
36360 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
36370 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
36380 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
36390 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a  );.  if( pageInJ
363a0 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
363b0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
363c0 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73  (pPg) ){.    ass
363d0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
363e0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  l(pPager) );.  }
363f0 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
36400 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
36410 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
36420 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
36430 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
36440 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
36450 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
36460 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
36470 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
36480 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
36490 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
364a0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
364b0 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
364c0 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
364d0 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75    if( !pageInJou
364e0 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 70 61  rnal(pPg) && !pa
364f0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
36500 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
36510 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
36520 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20  Pager)==0 );.   
36530 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
36540 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
36550 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70  Size && isOpen(p
36560 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
36570 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
36580 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
36590 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20  pData2;.        
365a0 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65  i64 iOff = pPage
365b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
365c0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
365d0 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
365e0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
365f0 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
36600 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
36610 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
36620 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
36630 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
36640 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
36650 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
36660 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
36670 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
36680 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
36690 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
366a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
366b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c  ger->journalHdr<
366c0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
366d0 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43  Off );.        C
366e0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
366f0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
36700 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
36710 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
36720 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d  .        cksum =
36730 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
36740 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
36750 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  );..        /* E
36760 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20  ven if an IO or 
36770 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f  diskfull error o
36780 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72  ccurs while jour
36790 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20  nalling the.    
367a0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
367b0 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
367c0 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
367d0 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
367e0 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  age..        ** 
367f0 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20  Otherwise, when 
36800 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
36810 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
36820 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20  the logic in.   
36830 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b       ** playback
36840 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
36850 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
36860 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
36870 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20   restored.      
36880 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
36890 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
368a0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
368b0 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
368c0 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20   so,.        ** 
368d0 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20  then corruption 
368e0 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20  may follow..    
368f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
36900 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
36910 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20  DR_NEED_SYNC;.. 
36920 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
36930 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
36940 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e  jfd, iOff, pPg->
36950 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
36960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36970 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36980 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36990 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
369a0 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
369b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
369c0 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20   iOff+4);.      
369d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
369e0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
369f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
36a00 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
36a10 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67  ->jfd, iOff+pPag
36a20 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
36a30 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
36a40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
36a50 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
36a60 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
36a70 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
36a80 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
36a90 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
36aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
36ab0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
36ac0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
36ad0 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
36ae0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
36af0 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
36b00 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
36b10 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
36b20 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
36b30 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
36b40 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
36b50 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
36b60 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
36b70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
36b80 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
36b90 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
36ba0 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
36bb0 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20  sh(pPg)));..    
36bc0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
36bd0 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50  nalOff += 8 + pP
36be0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
36bf0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
36c00 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
36c10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36c20 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
36c30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
36c40 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
36c50 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36c60 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
36c70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
36c80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
36c90 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  M );.        ass
36ca0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
36cb0 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
36cc0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
36cd0 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76    rc |= addToSav
36ce0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
36cf0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
36d00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
36d10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36d20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
36d30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
36d40 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  M );.          r
36d50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36d60 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
36d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
36d80 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
36d90 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
36da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
36db0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
36dc0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
36dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
36de0 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e  GERTRACE(("APPEN
36df0 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
36e00 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
36e10 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
36e20 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
36e30 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
36e40 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
36e50 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
36e60 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
36e70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
36e80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
36e90 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
36ea0 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
36eb0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
36ec0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
36ed0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
36ee0 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
36ef0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
36f00 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
36f10 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
36f20 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
36f30 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
36f40 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
36f50 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
36f60 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
36f70 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
36f80 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
36f90 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
36fa0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
36fb0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
36fc0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
36fd0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
36fe0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
36ff0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
37000 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
37010 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
37020 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
37030 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
37040 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
37050 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
37060 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
37070 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
37080 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
37090 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
370a0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
370b0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
370c0 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
370d0 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
370e0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
370f0 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
37100 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
37110 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
37120 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
37130 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
37140 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
37150 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
37160 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
37170 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
37180 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
37190 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
371a0 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
371b0 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
371c0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
371d0 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
371e0 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
371f0 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
37200 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
37210 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
37220 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
37230 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
37240 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
37250 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
37260 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
37270 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
37280 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
37290 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
372a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
372b0 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
372c0 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
372d0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
372e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
372f0 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
37300 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
37310 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
37320 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
37330 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
37340 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
37350 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
37360 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
37370 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
37380 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
37390 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ze);..  assert( 
373a0 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
373b0 48 44 52 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b 0a  HDR_MMAP)==0 );.
373c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
373d0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
373e0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
373f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37400 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
37410 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
37420 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
37430 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
37440 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65  ;..  if( nPagePe
37450 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
37460 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
37470 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
37480 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
37490 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
374a0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
374b0 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
374c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
374d0 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
374e0 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
374f0 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
37500 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20  nPage = 0;      
37510 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
37520 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
37530 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
37540 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
37550 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
37560 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
37570 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
37580 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20  needSync = 0;   
37590 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
375a0 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47   any page has PG
375b0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f  HDR_NEED_SYNC */
375c0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
375d0 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
375e0 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20  flag to 1. This 
375f0 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61  is because we ca
37600 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a  nnot allow.    *
37610 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  * a journal head
37620 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  er to be written
37630 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67   between the pag
37640 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a  es journaled by.
37650 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63      ** this func
37660 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
37670 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
37680 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
37690 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
376a0 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  Spill==0 );.    
376b0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
376c0 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f  cSpill++;..    /
376d0 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
376e0 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
376f0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
37700 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
37710 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
37720 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
37730 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
37740 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
37750 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
37760 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
37770 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
37780 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
37790 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
377a0 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
377b0 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
377c0 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
377d0 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50   nPageCount = pP
377e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
377f0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
37800 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
37810 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
37820 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
37830 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
37840 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
37850 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
37860 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
37870 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
37880 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
37890 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
378a0 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
378b0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
378c0 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
378d0 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
378e0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
378f0 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
37900 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
37910 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
37920 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
37930 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
37940 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
37950 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
37960 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
37970 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
37980 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
37990 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
379a0 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
379b0 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
379c0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
379d0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
379e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
379f0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
37a00 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
37a10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37a30 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
37a40 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
37a50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
37a60 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
37a70 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
37a80 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
37a90 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
37aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37ab0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
37ac0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
37ad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37ae0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
37af0 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
37b00 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
37b10 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
37b20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
37b30 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
37b40 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
37b50 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
37b60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37b70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
37b80 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
37b90 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
37ba0 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
37bb0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
37bc0 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
37bd0 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
37be0 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
37bf0 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
37c00 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
37c10 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
37c20 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
37c30 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
37c40 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
37c50 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
37c60 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
37c70 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
37c80 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
37c90 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
37ca0 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
37cb0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
37cc0 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
37cd0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
37ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37cf0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
37d00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37d10 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a   && needSync ){.
37d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
37d30 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 66 6f  EMDB );.      fo
37d40 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
37d50 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
37d60 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
37d70 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
37d80 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
37d90 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
37da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
37db0 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  ge->flags |= PGH
37dc0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
37dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
37de0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
37df0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37e00 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
37e10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
37e20 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31  oNotSyncSpill==1
37e30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
37e40 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d  doNotSyncSpill--
37e50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
37e60 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
37e70 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
37e80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37e90 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
37ea0 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
37eb0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
37ec0 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
37ed0 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
37ee0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
37ef0 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
37f00 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
37f10 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
37f20 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
37f30 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
37f40 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
37f50 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
37f60 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37f70 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
37f80 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67  return pPg->flag
37f90 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d  s&PGHDR_DIRTY;.}
37fa0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
37fb0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
37fc0 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
37fd0 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
37fe0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
37ff0 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
38000 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
38010 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
38020 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
38030 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
38040 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
38050 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69  d as dirty.  Thi
38060 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
38070 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20  xample, when.** 
38080 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
38090 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61  n added as a lea
380a0 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
380b0 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20  t and so its.** 
380c0 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65  content no longe
380d0 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  r matters..**.**
380e0 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
380f0 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
38100 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
38110 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
38120 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
38130 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
38140 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20  used. The pager 
38150 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
38160 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
38170 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
38180 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
38190 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
381a0 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
381b0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
381c0 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
381d0 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a  eed of large .**
381e0 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
381f0 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
38200 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
38210 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
38220 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
38230 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
38240 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
38250 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20  PGHDR_DIRTY) && 
38260 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
38270 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47  nt==0 ){.    PAG
38280 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57  ERTRACE(("DONT_W
38290 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
382a0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
382b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
382c0 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  )));.    IOTRACE
382d0 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
382e0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
382f0 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e  pgno)).    pPg->
38300 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
38310 4f 4e 54 5f 57 52 49 54 45 3b 0a 20 20 20 20 70  ONT_WRITE;.    p
38320 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
38330 68 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  h(pPg);.  }.}../
38340 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
38350 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
38360 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
38370 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
38380 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e  se file .** chan
38390 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72  ge-counter, stor
383a0 65 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62  ed as a 4-byte b
383b0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
383c0 72 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a  r starting at .*
383d0 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  * byte offset 24
383e0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
383f0 6c 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 61  le.  The seconda
38400 72 79 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ry change counte
38410 72 20 61 74 0a 2a 2a 20 39 32 20 69 73 20 61 6c  r at.** 92 is al
38420 73 6f 20 75 70 64 61 74 65 64 2c 20 61 73 20 69  so updated, as i
38430 73 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72  s the SQLite ver
38440 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
38450 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
38460 42 75 74 20 74 68 69 73 20 6f 6e 6c 79 20 68 61  But this only ha
38470 70 70 65 6e 73 20 69 66 20 74 68 65 20 70 50 61  ppens if the pPa
38480 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
38490 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 66 61 6c  Done flag is fal
384a0 73 65 2e 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  se..** To avoid 
384b0 65 78 63 65 73 73 20 63 68 75 72 6e 69 6e 67 20  excess churning 
384c0 6f 66 20 70 61 67 65 20 31 2c 20 74 68 65 20 75  of page 1, the u
384d0 70 64 61 74 65 20 6f 6e 6c 79 20 68 61 70 70 65  pdate only happe
384e0 6e 73 20 6f 6e 63 65 2e 0a 2a 2a 20 53 65 65 20  ns once..** See 
384f0 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 77  also the pager_w
38500 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
38510 65 72 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61  er() routine tha
38520 74 20 64 6f 65 73 20 61 6e 20 0a 2a 2a 20 75 6e  t does an .** un
38530 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61  conditional upda
38540 74 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  te of the change
38550 20 63 6f 75 6e 74 65 72 73 2e 0a 2a 2a 0a 2a 2a   counters..**.**
38560 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74   If the isDirect
38570 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72  Mode flag is zer
38580 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
38590 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
385a0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
385b0 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
385c0 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
385d0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
385e0 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
385f0 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
38600 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
38610 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
38620 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
38630 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
38640 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
38650 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
38660 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lag may only be 
38670 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
38680 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
38690 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  iled.** with the
386a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
386b0 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72  TOMIC_WRITE macr
386c0 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68  o defined. In th
386d0 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69  is case,.** if i
386e0 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a  sDirect is non-z
386f0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61  ero, then the da
38700 74 61 62 61 73 65 20 66 69 6c 65 20 69