/ Hex Artifact Content
Login

Artifact d981f3bfcc0e4460537d983899620700ccf8f539:


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 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20    u8 syncFlags; 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77  SYNC_FULL otherw
7230: 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ise */.  u8 temp
7240: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
7250: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
7260: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
7270: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
7280: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
7290: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
72a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
72b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
72c0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72e0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
72f0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
7300: 2a 2a 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 0a 20 20 2a 2a 20  **********.  ** 
7350: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7360: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
7370: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7380: 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72   that change dur
7390: 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ing.  ** routine
73a0: 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73   opertion.  Clas
73b0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
73c0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
73d0: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
73e0: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
73f0: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7400: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7410: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7420: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7430: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7440: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7450: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7460: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
7470: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
7480: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
7490: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
74a0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
74b0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
74c0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
74d0: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
74e0: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
74f0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7500: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7510: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7520: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7530: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7550: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7560: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
7570: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
7580: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
75a0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
75b0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
75c0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
75d0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
75e0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
75f0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7600: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7610: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7630: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7640: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7650: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7660: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
7670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7680: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
7690: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
76a0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 64  n-zero */.  u8 d
76b0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20 20  oNotSyncSpill;  
76c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
76d0: 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68 61  t do a spill tha
76e0: 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c 20  t requires jrnl 
76f0: 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75 62  sync */.  u8 sub
7700: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
7710: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7720: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
7730: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
7740: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7760: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7770: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7780: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
7790: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
77b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
77c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
77d0: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
77e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
77f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
7800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7810: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48  le */.  Pgno dbH
7820: 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  intSize;        
7830: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73      /* Value pas
7840: 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a  sed to FCNTL_SIZ
7850: 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20  E_HINT call */. 
7860: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7880: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
7890: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
78a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
78d0: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
78e0: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
78f0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
7900: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
7910: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
7920: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
7930: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
7940: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
7970: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
7980: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7990: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
79a0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
79b0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
79c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
79d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
79e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
79f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7a00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7a10: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7a20: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7a30: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7a40: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7a50: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7a70: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7a80: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a90: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
7aa0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
7ab0: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
7ac0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7ad0: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
7ae0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7af0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
7b00: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
7b10: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
7b20: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
7b30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
7b40: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
7b50: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
7b60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
7b70: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
7b80: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
7b90: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
7ba0: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
7bb0: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
7bc0: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
7bd0: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bf0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
7c00: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
7c10: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  [] */.  char dbF
7c20: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
7c30: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
7c40: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
7c50: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
7c60: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
7c70: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
7c80: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
7c90: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
7cf0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
7d00: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
7d10: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
7d20: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
7d30: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
7d40: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
7d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7d60: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
7d70: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
7d80: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
7d90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7da0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
7db0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
7dc0: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
7dd0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
7de0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
7df0: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
7e00: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
7e10: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e30: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7e40: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
7e50: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
7e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7e70: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
7e80: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
7e90: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
7ea0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7eb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
7ec0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
7ed0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
7ee0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
7ef0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
7f00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
7f10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7f20: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
7f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7f40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
7f50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7f60: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
7f70: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
7f80: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
7f90: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
7fa0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
7fb0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
7fc0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
7fd0: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
7fe0: 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  /.  int nHit, nM
7ff0: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
8000: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
8010: 69 74 73 20 61 6e 64 20 6d 69 73 73 65 73 20 2a  its and misses *
8020: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8030: 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64  TEST.  int nRead
8040: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
8050: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
8060: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
8070: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
8080: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8090: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
80a0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
80b0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
80c0: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
80d0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
80e0: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
80f0: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8100: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
8110: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
8120: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
8130: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
8140: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
8150: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
8160: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8170: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8180: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8190: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
81a0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
81b0: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
81c0: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
81e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
81f0: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8200: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
8210: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
8220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8230: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
8240: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
8250: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
8260: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8270: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8280: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8290: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
82a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
82b0: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
82e0: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
82f0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8300: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
8330: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
8340: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
8350: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
8360: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
8370: 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65  bles hold counte
8380: 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  rs used for.** t
8390: 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
83a0: 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72  only.  These var
83b0: 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78  iables do not ex
83c0: 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d  ist in.** a non-
83d0: 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20  testing build.  
83e0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
83f0: 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73  are not thread-s
8400: 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  afe..*/.#ifdef S
8410: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
8420: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
8430: 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ddb_count = 0;  
8440: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
8450: 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66  ull pages read f
8460: 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71  rom DB */.int sq
8470: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
8480: 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  edb_count = 0;  
8490: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
84a0: 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ll pages written
84b0: 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71   to DB */.int sq
84c0: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
84d0: 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  ej_count = 0;   
84e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
84f0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  ges written to j
8500: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69  ournal */.# defi
8510: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
8520: 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65    v++.#else.# de
8530: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
8540: 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  v).#endif..../*.
8550: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
8560: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
8570: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
8580: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
8590: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
85a0: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
85b0: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
85c0: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
85d0: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
85e0: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
85f0: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
8600: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
8610: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
8620: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
8630: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
8640: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
8650: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
8660: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74  is being.** writ
8670: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
8680: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
8690: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
86a0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
86b0: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
86c0: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
86d0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
86e0: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
86f0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
8700: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
8710: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
8720: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
8730: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
8740: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
8750: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
8760: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
8770: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
8780: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
8790: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
87a0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
87b0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
87c0: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
87d0: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
87e0: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
87f0: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
8800: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
8810: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
8820: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
8830: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
8840: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8850: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
8860: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
8870: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
8880: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
8890: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
88a0: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
88b0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
88c0: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
88d0: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
88e0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
88f0: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
8900: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
8910: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
8920: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
8930: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
8940: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
8950: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
8960: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
8970: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
8980: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
8990: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
89a0: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
89b0: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
89c0: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
89d0: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
89e0: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
89f0: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
8a00: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
8a10: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
8a20: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
8a30: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
8a40: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
8a50: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
8a60: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
8a70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
8a80: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
8a90: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
8aa0: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
8ab0: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
8ac0: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
8ad0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20   size of the of 
8ae0: 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64  each page record
8af0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
8b00: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74  is given by.** t
8b10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
8b20: 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ro..*/.#define J
8b30: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
8b40: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
8b50: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
8b60: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
8b70: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
8b80: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  r this pager. Th
8b90: 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68  is is usually th
8ba0: 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20  e same .** size 
8bb0: 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  as a single disk
8bc0: 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73   sector. See als
8bd0: 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  o setSectorSize(
8be0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  )..*/.#define JO
8bf0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
8c00: 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65  ger) (pPager->se
8c10: 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a  ctorSize)../*.**
8c20: 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42   The macro MEMDB
8c30: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
8c40: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
8c50: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
8c60: 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20  abase..** We do 
8c70: 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20  this as a macro 
8c80: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53  so that if the S
8c90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8ca0: 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74  YDB macro is set
8cb0: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
8cc0: 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20  f MEMDB will be 
8cd0: 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74  a constant and t
8ce0: 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c  he compiler will
8cf0: 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74   optimize.** out
8d00: 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64   code that would
8d10: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a   never execute..
8d20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8d30: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23  _OMIT_MEMORYDB.#
8d40: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a   define MEMDB 0.
8d50: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
8d60: 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d  EMDB pPager->mem
8d70: 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Db.#endif../*.**
8d80: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
8d90: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
8da0: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
8db0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
8dc0: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
8dd0: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  47../*.** The ar
8de0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
8df0: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
8e00: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
8e10: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
8e20: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
8e30: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
8e40: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
8e50: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
8e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
8e70: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
8e80: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
8e90: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
8ea0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
8eb0: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
8ec0: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
8ed0: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
8ee0: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
8ef0: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
8f00: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
8f10: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  pFd)->pMethods).
8f20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
8f30: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
8f40: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
8f50: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
8f60: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
8f70: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
8f80: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
8f90: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
8fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
8fb0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
8fc0: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
8fd0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
8fe0: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
8ff0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9000: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
9010: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9020: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
9030: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9040: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
9050: 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65 20  y,z) 0.# define 
9060: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
9070: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
9080: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
9090: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
90a0: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
90b0: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  OK.#endif..#ifnd
90c0: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
90d0: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
90e0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
90f0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
9100: 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r) );.**.** This
9110: 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d   function runs m
9120: 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74  any asserts to t
9130: 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e  ry to find incon
9140: 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a  sistencies in.**
9150: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
9160: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
9170: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
9180: 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61  ic int assert_pa
9190: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
91a0: 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  *p){.  Pager *pP
91b0: 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20  ager = p;..  /* 
91c0: 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61  State must be va
91d0: 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lid. */.  assert
91e0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ( p->eState==PAG
91f0: 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c  ER_OPEN.       |
9200: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9210: 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20  ER_READER.      
9220: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9230: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9240: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9250: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9260: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
9270: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9280: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9290: 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
92a0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
92b0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
92c0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
92d0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
92e0: 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67  R.  );..  /* Reg
92f0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63  ardless of the c
9300: 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20  urrent state, a 
9310: 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63  temp-file connec
9320: 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61  tion always beha
9330: 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69  ves.  ** as if i
9340: 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  t has an exclusi
9350: 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
9360: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
9370: 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20   never updates. 
9380: 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63   ** the change-c
9390: 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f  ounter field, so
93a0: 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
93b0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77  Done flag is alw
93c0: 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ays set..  */.  
93d0: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
93e0: 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f  ile==0 || p->eLo
93f0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
9400: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9410: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
9420: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
9430: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
9440: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75  /* If the useJou
9450: 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65  rnal flag is cle
9460: 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ar, the journal-
9470: 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46  mode must be "OF
9480: 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66  F". .  ** And if
9490: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
94a0: 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20  e is "OFF", the 
94b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
94c0: 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t not be open.. 
94d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
94e0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
94f0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9500: 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75  OFF || p->useJou
9510: 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
9520: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9530: 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
9540: 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70  ODE_OFF || !isOp
9550: 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  en(p->jfd) );.. 
9560: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d   /* Check that M
9570: 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53  EMDB implies noS
9580: 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d  ync. And an in-m
9590: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53  emory journal. S
95a0: 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20  ince .  ** this 
95b0: 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  means an in-memo
95c0: 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d  ry pager perform
95d0: 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20  s no IO at all, 
95e0: 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e  it cannot encoun
95f0: 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  ter .  ** either
9600: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
9610: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72   SQLITE_FULL dur
9620: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  ing rollback or 
9630: 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67  while finalizing
9640: 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c   .  ** a journal
9650: 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68   file. (although
9660: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
9670: 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74  ournal implement
9680: 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20  ation may .  ** 
9690: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
96a0: 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20  ERR_NOMEM while 
96b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
96c0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
96d0: 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20  n). It .  ** is 
96e0: 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f  therefore not po
96f0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e  ssible for an in
9700: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f  -memory pager to
9710: 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
9720: 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20   .  ** state..  
9730: 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
9740: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9750: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61  >noSync );.    a
9760: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9770: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9780: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9790: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
97a0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
97b0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
97c0: 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  RY .    );.    a
97d0: 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65  ssert( p->eState
97e0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
97f0: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9800: 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73  R_OPEN );.    as
9810: 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
9820: 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  l(p)==0 );.  }..
9830: 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f    /* If changeCo
9840: 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20  untDone is set, 
9850: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9860: 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
9870: 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20  be held.  ** on 
9880: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
9890: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
98a0: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
98b0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
98c0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
98d0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
98e0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49   p->eLock!=PENDI
98f0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77  NG_LOCK );..  sw
9900: 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20  itch( p->eState 
9910: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
9920: 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73  R_OPEN:.      as
9930: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
9940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9950: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9960: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9970: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9980: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
9990: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
99a0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
99b0: 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
99c0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
99d0: 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a  e PAGER_READER:.
99e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
99f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9a00: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9a10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9a20: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
9a30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9a40: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ( p->eLock>=SHAR
9a50: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f  ED_LOCK || p->no
9a60: 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  Readlock );.    
9a70: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
9a80: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
9a90: 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73  LOCKED:.      as
9aa0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
9ab0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
9ac0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9ad0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9ae0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9af0: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
9b00: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
9b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9b20: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
9b30: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
9b40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9b50: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70  Pager->dbSize==p
9b60: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
9b70: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
9b80: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
9b90: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
9ba0: 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  bFileSize );.   
9bb0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9bc0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
9bd0: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
9be0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
9bf0: 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
9c00: 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ster==0 );.     
9c10: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9c20: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  e PAGER_WRITER_C
9c30: 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61  ACHEMOD:.      a
9c40: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9c50: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
9c60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9c70: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
9c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9c90: 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65     if( !pagerUse
9ca0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
9cb0: 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20         /* It is 
9cc0: 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69 66  possible that if
9cd0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
9ce0: 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65 69 74  l here that neit
9cf0: 68 65 72 20 74 68 65 0a 20 20 20 20 20 20 20 20  her the.        
9d00: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
9d10: 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65  nor the WAL file
9d20: 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20   are open. This 
9d30: 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20  happens during. 
9d40: 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c         ** a roll
9d50: 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e  back transaction
9d60: 20 74 68 61 74 20 73 77 69 74 63 68 65 73 20 66   that switches f
9d70: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  rom journal_mode
9d80: 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  =off.        ** 
9d90: 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  to journal_mode=
9da0: 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  wal..        */.
9db0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9dc0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
9dd0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9de0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
9df0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
9e00: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
9e10: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9e20: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9e30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
9e40: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
9e50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9e60: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20  ODE_WAL .       
9e70: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9e80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9e90: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
9ea0: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
9eb0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9ec0: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
9ed0: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
9ee0: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
9ef0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
9f00: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
9f10: 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  DBMOD:.      ass
9f20: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
9f30: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9f40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f50: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
9f60: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9f70: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
9f80: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
9f90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9fa0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55   p->eLock>=EXCLU
9fb0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
9fc0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
9fd0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
9fe0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9ff0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a000: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a010: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a020: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a030: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a040: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a050: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a060: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d  er->dbOrigSize<=
a070: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a080: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a090: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a0a0: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
a0b0: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a0c0: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a0d0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a0f0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a100: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a110: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a120: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a140: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a150: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a160: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a170: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a180: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a190: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a1a0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a1b0: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a1c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a1d0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52     case PAGER_ER
a1e0: 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68  ROR:.      /* Th
a1f0: 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
a200: 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
a210: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74  ding reference t
a220: 6f 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20  o the pager if. 
a230: 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52       ** in ERROR
a240: 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
a250: 65 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75  e the pager shou
a260: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
a270: 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a  dropped.      **
a280: 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
a290: 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
a2a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a2b0: 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
a2c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a2d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a2e0: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
a2f0: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
a300: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a310: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31  .  }..  return 1
a320: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
a330: 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  ndef NDEBUG */..
a340: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a350: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  BUG ./*.** Retur
a360: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
a370: 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
a380: 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74  string in a stat
a390: 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e  ic buffer.** con
a3a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74  taining the stat
a3b0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
a3c0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
a3d0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  an argument. Thi
a3e0: 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64  s.** is intended
a3f0: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
a400: 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f  in debuggers. Fo
a410: 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e  r example, as an
a420: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
a430: 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65  to "print *pPage
a440: 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a  r" in gdb:.**.**
a450: 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25   (gdb) printf "%
a460: 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f  s", print_pager_
a470: 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f  state(pPager).*/
a480: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72  .static char *pr
a490: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
a4a0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61  Pager *p){.  sta
a4b0: 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30  tic char zRet[10
a4c0: 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  24];..  sqlite3_
a4d0: 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a  snprintf(1024, z
a4e0: 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65  Ret,.      "File
a4f0: 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22  name:      %s\n"
a500: 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20  .      "State:  
a510: 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64         %s errCod
a520: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c  e=%d\n".      "L
a530: 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73  ock:          %s
a540: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69  \n".      "Locki
a550: 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e  ng mode:  lockin
a560: 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  g_mode=%s\n".   
a570: 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65     "Journal mode
a580: 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  :  journal_mode=
a590: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63  %s\n".      "Bac
a5a0: 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70  king store: temp
a5b0: 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64  File=%d memDb=%d
a5c0: 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e   useJournal=%d\n
a5d0: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
a5e0: 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f  :       journalO
a5f0: 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48  ff=%lld journalH
a600: 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20  dr=%lld\n".     
a610: 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20   "Size:         
a620: 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69   dbsize=%d dbOri
a630: 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53  gSize=%d dbFileS
a640: 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ize=%d\n".      
a650: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20  , p->zFilename. 
a660: 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65       , p->eState
a670: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  ==PAGER_OPEN    
a680: 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22          ? "OPEN"
a690: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a6a0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
a6b0: 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52  ER          ? "R
a6c0: 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20  EADER" :.       
a6d0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a6e0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
a6f0: 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b    ? "WRITER_LOCK
a700: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
a710: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
a720: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f  RITER_CACHEMOD ?
a730: 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f   "WRITER_CACHEMO
a740: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a750: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
a760: 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20  ITER_DBMOD    ? 
a770: 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a  "WRITER_DBMOD" :
a780: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a790: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a7a0: 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49  _FINISHED ? "WRI
a7b0: 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a  TER_FINISHED" :.
a7c0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a7d0: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20  e==PAGER_ERROR  
a7e0: 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f           ? "ERRO
a7f0: 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  R" : "?error?". 
a800: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65       , (int)p->e
a810: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70  rrCode.      , p
a820: 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
a830: 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c           ? "NO_L
a840: 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70  OCK" :.        p
a850: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
a860: 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45  D_LOCK   ? "RESE
a870: 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  RVED" :.        
a880: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a890: 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43  IVE_LOCK  ? "EXC
a8a0: 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20  LUSIVE" :.      
a8b0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52    p->eLock==SHAR
a8c0: 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53  ED_LOCK     ? "S
a8d0: 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20  HARED" :.       
a8e0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f   p->eLock==UNKNO
a8f0: 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e  WN_LOCK    ? "UN
a900: 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72  KNOWN" : "?error
a910: 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78  ?".      , p->ex
a920: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65  clusiveMode ? "e
a930: 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72  xclusive" : "nor
a940: 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  mal".      , p->
a950: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a960: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
a970: 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72  EMORY   ? "memor
a980: 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  y" :.        p->
a990: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a9a0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
a9b0: 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20  FF      ? "off" 
a9c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
a9d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a9e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
a9f0: 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20  TE   ? "delete" 
aa00: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
aa10: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
aa20: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
aa30: 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22  IST  ? "persist"
aa40: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aa50: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aa60: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
aa70: 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74  NCATE ? "truncat
aa80: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
aa90: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
aaa0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
aab0: 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20  AL      ? "wal" 
aac0: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
aad0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70    , (int)p->temp
aae0: 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65  File, (int)p->me
aaf0: 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65  mDb, (int)p->use
ab00: 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20  Journal.      , 
ab10: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  p->journalOff, p
ab20: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
ab30: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53     , (int)p->dbS
ab40: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f  ize, (int)p->dbO
ab50: 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  rigSize, (int)p-
ab60: 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b  >dbFileSize.  );
ab70: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
ab80: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
ab90: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
aba0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
abb0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
abc0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
abd0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
abe0: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
abf0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
ac00: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
ac10: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
ac20: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
ac30: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
ac40: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
ac50: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
ac60: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
ac70: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
ac80: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
ac90: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
aca0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
acb0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
acc0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
acd0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
ace0: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
acf0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
ad00: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
ad10: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
ad20: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
ad30: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
ad40: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
ad50: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
ad60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ad70: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ad80: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
ad90: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
ada0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
adb0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
adc0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
add0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
ade0: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
adf0: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
ae00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
ae10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
ae20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
ae30: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
ae40: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
ae50: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
ae60: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
ae70: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
ae80: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
ae90: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
aea0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
aeb0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
aec0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
aed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
aee0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
aef0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
af00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
af10: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
af20: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
af30: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
af40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
af50: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
af60: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
af70: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
af80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
af90: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
afa0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
afb0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
afc0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
afd0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
afe0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
aff0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
b000: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
b010: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
b020: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
b030: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
b040: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
b050: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
b060: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b070: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
b080: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
b090: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b0a0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b0b0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b0c0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
b0d0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
b0e0: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
b0f0: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
b100: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
b110: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
b120: 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  B).../*.** Write
b130: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
b140: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
b150: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b160: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b170: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
b180: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
b190: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
b1a0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
b1b0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
b1c0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
b1d0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
b1e0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
b1f0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
b200: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
b210: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
b220: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
b230: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
b240: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
b250: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
b260: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
b270: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
b280: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20  ther NO_LOCK.** 
b290: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20  or SHARED_LOCK. 
b2a0: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
b2b0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
b2c0: 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b   call to xUnlock
b2d0: 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20  ().** succeeds, 
b2e0: 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c  set the Pager.eL
b2f0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
b300: 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d  match the (attem
b310: 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a  pted) new lock..
b320: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
b330: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
b340: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
b350: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
b360: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
b370: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
b380: 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63  fy it. See the c
b390: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
b3a0: 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20   #define of .** 
b3b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
b3c0: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
b3d0: 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  of this..*/.stat
b3e0: 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f  ic int pagerUnlo
b3f0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
b400: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
b410: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b420: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
b430: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
b440: 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
b450: 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20  r->eLock==eLock 
b460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b470: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck==NO_LOCK || e
b480: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
b490: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
b4a0: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
b4b0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
b4c0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ger)==0 );.  if(
b4d0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
b4e0: 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
b4f0: 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
b500: 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72  >=eLock );.    r
b510: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  c = sqlite3OsUnl
b520: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
b530: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
b540: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55  pPager->eLock!=U
b550: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20  NKNOWN_LOCK ){. 
b560: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
b570: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
b580: 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
b590: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64  E(("UNLOCK %p %d
b5a0: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f  \n", pPager, eLo
b5b0: 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck)).  }.  retur
b5c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
b5d0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
b5e0: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
b5f0: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
b600: 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52 45   be either SHARE
b610: 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52  D_LOCK,.** RESER
b620: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
b630: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74  USIVE_LOCK. If t
b640: 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63  he caller is suc
b650: 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
b660: 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  .** Pager.eLock 
b670: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
b680: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
b690: 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  e. .**.** Except
b6a0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b6b0: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b6c0: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b6d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  s function is .*
b6e0: 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74  * called, do not
b6f0: 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73   modify it unles
b700: 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  s the new lockin
b710: 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c 55  g state is EXCLU
b720: 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53  SIVE_LOCK. .** S
b730: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
b740: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
b750: 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   of UNKNOWN_LOCK
b760: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b770: 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e  ion .** of this.
b780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b790: 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72  agerLockDb(Pager
b7a0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
b7b0: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
b7c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
b7d0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48  ssert( eLock==SH
b7e0: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ARED_LOCK || eLo
b7f0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
b800: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c  K || eLock==EXCL
b810: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
b820: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b830: 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65  k<eLock || pPage
b840: 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
b850: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  N_LOCK ){.    rc
b860: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
b870: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
b880: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
b890: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
b8a0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
b8b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
b8c0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
b8d0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
b8e0: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
b8f0: 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  eLock;.      IOT
b900: 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
b910: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
b920: 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock)).    }.  }.
b930: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b940: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b950: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
b960: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b970: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
b980: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
b990: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
b9a0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
b9b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
b9c0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
b9d0: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
b9e0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
b9f0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
ba00: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
ba10: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
ba20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
ba30: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
ba40: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
ba50: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
ba60: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
ba70: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
ba80: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
ba90: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
baa0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
bab0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
bac0: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
bad0: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
bae0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
baf0: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
bb00: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
bb10: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
bb20: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
bb30: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
bb40: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
bb50: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
bb60: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
bb70: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
bb80: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
bb90: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
bba0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
bbb0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
bbc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
bbd0: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
bbe0: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
bbf0: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
bc00: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
bc10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
bc20: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
bc30: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
bc40: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
bc50: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
bc60: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
bc70: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
bc80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
bcb0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
bcc0: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
bcd0: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bcf0: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
bd00: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
bd30: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
bd40: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
bd50: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
bd60: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
bd70: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
bd80: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
bd90: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
bda0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
bdb0: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
bdc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
bdd0: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
bde0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
bdf0: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
be00: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
be10: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
be20: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
be30: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
be40: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
be50: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
be60: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
be70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
be80: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
be90: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
bea0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
beb0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
bec0: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
bed0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
bee0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
bef0: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
bf00: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
bf10: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
bf20: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
bf30: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
bf40: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
bf50: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
bf60: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
bf70: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
bf80: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
bf90: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
bfa0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
bfb0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
bfc0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
bfd0: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
bfe0: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
bff0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
c000: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
c010: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
c020: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
c030: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
c040: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
c050: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
c060: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
c070: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c080: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
c090: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
c0a0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c0b0: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
c0c0: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
c0d0: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
c0e0: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
c0f0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
c100: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
c110: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
c120: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c130: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
c140: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
c150: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
c160: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
c170: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
c180: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c190: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
c1a0: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
c1b0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
c1c0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
c1d0: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
c1e0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
c1f0: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
c200: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
c210: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
c220: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
c230: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
c240: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
c250: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
c260: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
c270: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
c280: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
c290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
c2a0: 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
c2b0: 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
c2c0: 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
c2d0: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
c2e0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
c2f0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
c300: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
c310: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
c320: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
c330: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
c340: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
c350: 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61  ine pager_set_pa
c360: 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e  gehash(X).#defin
c370: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
c380: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
c390: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
c3a0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
c3b0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
c3c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
c3d0: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
c3e0: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
c3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
c400: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
c410: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c420: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
c430: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
c440: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
c450: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
c460: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
c470: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
c480: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
c490: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
c4a0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
c4b0: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
c4c0: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
c4d0: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
c4e0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
c4f0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
c500: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
c510: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
c520: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
c530: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
c540: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
c550: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
c560: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
c570: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
c580: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
c590: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
c5a0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
c5b0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
c5c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c5d0: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
c5e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
c5f0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
c600: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
c610: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
c620: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
c630: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
c640: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
c650: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
c660: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
c670: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
c680: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
c690: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
c6a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c6b0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c6c0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
c6d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
c6e0: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
c6f0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
c700: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
c710: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
c720: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
c730: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
c740: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
c750: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
c760: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
c770: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
c780: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
c790: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
c7a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c7b0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c7c0: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
c7d0: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
c7e0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
c7f0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
c800: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
c810: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
c820: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
c830: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
c840: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
c850: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
c860: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
c870: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
c880: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
c890: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
c8a0: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
c8b0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
c8c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c8d0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
c8e0: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
c8f0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
c900: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
c910: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
c920: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
c950: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
c960: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
c970: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c990: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
c9a0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
c9b0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
c9e0: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
c9f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
ca00: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
ca10: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
ca20: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
ca30: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
ca40: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
ca50: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
ca60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
ca70: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
ca80: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
ca90: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
caa0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
cab0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
cac0: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
cad0: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
cae0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
caf0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
cb00: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
cb10: 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  sum)).   || SQLI
cb20: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cb30: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
cb40: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
cb50: 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d  -8)).   || memcm
cb60: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
cb70: 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c  alMagic, 8).   |
cb80: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cb90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
cba0: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
cbb0: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
cbc0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
cbd0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
cbe0: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
cbf0: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
cc00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cc10: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
cc20: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
cc30: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
cc40: 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69  ster[u];.  }.  i
cc50: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
cc60: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
cc70: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
cc80: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
cc90: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
cca0: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
ccb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
ccc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ccd0: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
cce0: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
ccf0: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
cd00: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
cd10: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
cd20: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
cd30: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
cd40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
cd50: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
cd60: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a     len = 0;.  }.
cd70: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
cd80: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
cd90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cda0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cdb0: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
cdc0: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
cdd0: 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65   at or immediate
cde0: 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ly .** following
cdf0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50   the value in pP
ce00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ce10: 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63  , assuming a sec
ce20: 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  tor .** size of 
ce30: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
ce40: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
ce50: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
ce60: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
ce70: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72  .**   Pager.jour
ce80: 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20  nalOff          
ce90: 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  Return value.** 
cea0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20           0.**   
cef0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
cf00: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
cf10: 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20     100          
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
cf30: 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20  .**   2000      
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
cf60: 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  ic i64 journalHd
cf70: 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70  rOffset(Pager *p
cf80: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
cf90: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
cfa0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
cfb0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
cfc0: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
cfd0: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
cfe0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
cff0: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
d000: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
d010: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d020: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
d030: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
d040: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
d050: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
d060: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
d070: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d080: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66  ) );.  return of
d090: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
d0a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d0b0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
d0c0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d0d0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
d0e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d0f0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
d100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
d110: 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74  s not been writt
d120: 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20  en to.** within 
d130: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
d140: 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66  saction (i.e. if
d150: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
d160: 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f==0)..**.** If 
d170: 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f  doTruncate is no
d180: 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61  n-zero or the Pa
d190: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d1a0: 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73  imit variable is
d1b0: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68  .** set to 0, th
d1c0: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  en truncate the 
d1d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d1e0: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
d1f0: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ze. Otherwise,.*
d200: 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79  * zero the 28-by
d210: 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65  te header at the
d220: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
d230: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65  urnal file. In e
d240: 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20  ither case, .** 
d250: 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
d260: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
d270: 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
d280: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64  urnal file immed
d290: 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72  iately .** after
d2a0: 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e   writing or trun
d2b0: 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  cating it..**.**
d2c0: 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   If Pager.journa
d2d0: 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65  lSizeLimit is se
d2e0: 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c  t to a positive,
d2f0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
d300: 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   and.** followin
d310: 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  g the truncation
d320: 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63   or zeroing desc
d330: 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20  ribed above the 
d340: 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
d350: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
d360: 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20  bytes is larger 
d370: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
d380: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
d390: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
d3a0: 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72  le to Pager.jour
d3b0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74  nalSizeLimit byt
d3c0: 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  es. The journal 
d3d0: 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
d3e0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63   need to be sync
d3f0: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ed following thi
d400: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
d410: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
d420: 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f  r occurs, abando
d430: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
d440: 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65   return the IO e
d450: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74  rror code..** Ot
d460: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
d470: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
d480: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
d490: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
d4a0: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
d4b0: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
d4c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d4f0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d500: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
d510: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
d520: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
d530: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
d540: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
d550: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d560: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
d570: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
d580: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
d590: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
d5a0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
d5b0: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
d5c0: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
d5d0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
d5e0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
d5f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
d600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d610: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
d620: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
d630: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
d640: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
d650: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
d660: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
d670: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
d680: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
d690: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
d6a0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
d6b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d6c0: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
d6d0: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
d6e0: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
d6f0: 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
d700: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
d710: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
d720: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
d730: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
d740: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
d750: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
d760: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
d770: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
d780: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
d790: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
d7a0: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
d7b0: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
d7c0: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
d7d0: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
d7e0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
d7f0: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
d800: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
d810: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
d820: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
d830: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
d840: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
d850: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
d860: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
d870: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
d880: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
d890: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
d8a0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
d8b0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
d8c0: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
d8d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d8e0: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
d8f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d900: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
d910: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
d920: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
d930: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
d940: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
d950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
d960: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
d970: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d980: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
d990: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
d9a0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
d9b0: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
d9c0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
d9d0: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
d9e0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
d9f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
da00: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
da10: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
da20: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
da30: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
da40: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
da50: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
da60: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
da70: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
da80: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
da90: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
daa0: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
dab0: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
dac0: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
dad0: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
dae0: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
daf0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
db00: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
db10: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
db20: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
db30: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
db40: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
db50: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
db60: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
db70: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
db80: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
db90: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
dba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
dbb0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
dbc0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
dbd0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dbe0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
dbf0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
dc00: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
dc10: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
dc20: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
dc30: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
dc40: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
dc50: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
dc60: 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67  ader = (u32)pPag
dc70: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20  er->pageSize;/* 
dc80: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
dc90: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
dca0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
dcb0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcd0: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
dce0: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
dcf0: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
dd20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
dd30: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
dd40: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
dd50: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
dd60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
dd70: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
dd80: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
dd90: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
dda0: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
ddb0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
ddc0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
ddd0: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
dde0: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
ddf0: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
de00: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
de10: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
de20: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
de30: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
de40: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
de50: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
de60: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
de70: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
de80: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
de90: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
dea0: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
deb0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
dec0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
ded0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
dee0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
def0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
df00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
df10: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
df20: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
df30: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
df40: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
df50: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
df60: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
df70: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
df80: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
df90: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
dfa0: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
dfb0: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
dfc0: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
dfd0: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
dfe0: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
dff0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
e000: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
e010: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
e020: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e030: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
e040: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
e050: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
e060: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
e070: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
e080: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
e090: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
e0a0: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
e0b0: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
e0c0: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
e0d0: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
e0e0: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
e0f0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
e100: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
e110: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
e120: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
e130: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
e140: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
e150: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
e160: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
e170: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
e180: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
e190: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
e1a0: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
e1b0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
e1c0: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
e1d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
e1e0: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
e1f0: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
e200: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
e210: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
e220: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
e230: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
e240: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
e250: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
e260: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
e270: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
e280: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
e290: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
e2a0: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
e2b0: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
e2c0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
e2d0: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
e2e0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
e2f0: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
e300: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
e310: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
e320: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
e330: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
e340: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
e350: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
e360: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
e370: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
e380: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
e390: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
e3a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
e3b0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
e3c0: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
e3d0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
e3e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
e3f0: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
e400: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
e410: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
e420: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
e430: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
e440: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e450: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
e460: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e470: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e480: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
e490: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
e4a0: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
e4b0: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
e4c0: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
e4d0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
e4e0: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
e4f0: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
e500: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
e510: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
e520: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
e530: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e540: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
e550: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e560: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
e570: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
e580: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
e590: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
e5a0: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
e5b0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e5c0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e5d0: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
e5e0: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
e5f0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
e600: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
e610: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
e620: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e630: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e640: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
e650: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
e660: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
e670: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
e680: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
e690: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e6a0: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
e6b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
e6c0: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
e6d0: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
e6e0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
e6f0: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
e700: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
e710: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
e720: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
e730: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
e740: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
e750: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
e760: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
e770: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
e780: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
e790: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
e7a0: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
e7b0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
e7c0: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
e7d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e7e0: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
e7f0: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
e800: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e810: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
e820: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
e830: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
e840: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
e850: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
e860: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
e870: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
e880: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
e890: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
e8a0: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
e8b0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
e8c0: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
e8d0: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
e8e0: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
e8f0: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
e900: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
e910: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
e920: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
e930: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
e940: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
e950: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
e960: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
e970: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
e980: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
e990: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
e9a0: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
e9b0: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
e9c0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
e9d0: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
e9e0: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
e9f0: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
ea00: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
ea10: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
ea20: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
ea30: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
ea40: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
ea50: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
ea60: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
ea70: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
ea80: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
ea90: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
eaa0: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
eab0: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
eac0: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
ead0: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
eae0: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
eaf0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
eb00: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
eb10: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
eb20: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
eb30: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
eb40: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
eb50: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
eb60: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
eb70: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
eb80: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
eb90: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
eba0: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
ebb0: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
ebc0: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
ebd0: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
ebe0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ebf0: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
ec00: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
ec10: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
ec20: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
ec30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
ec40: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
ec50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ec60: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
ec70: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
ec80: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
ec90: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
eca0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
ecb0: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
ecc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
ecd0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
ece0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
ecf0: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
ed00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ed10: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
ed20: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
ed30: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
ed40: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
ed50: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
ed60: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
ed70: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
ed80: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
ed90: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
eda0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
edb0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
edc0: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
edd0: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
ede0: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
edf0: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
ee00: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
ee10: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
ee20: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
ee30: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
ee40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
ee50: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
ee60: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
ee70: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
ee80: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
ee90: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
eea0: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
eeb0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
eec0: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
eed0: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
eee0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
eef0: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
ef00: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
ef10: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
ef20: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
ef30: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
ef40: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
ef50: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
ef60: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
ef70: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
ef80: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
ef90: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
efa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
efb0: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
efc0: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
efd0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
efe0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
eff0: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
f000: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
f010: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
f020: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
f030: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
f040: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f050: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
f060: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
f070: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f080: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
f090: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0b0: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
f0c0: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
f0d0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f0f0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
f100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
f110: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
f120: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
f130: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f140: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
f150: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
f160: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
f190: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
f1a0: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
f1b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f1e0: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
f1f0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
f200: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
f210: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
f220: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
f230: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
f240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f250: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
f260: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
f270: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
f280: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
f290: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
f2a0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
f2b0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
f2c0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
f2d0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
f2e0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f2f0: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
f300: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
f310: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
f320: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
f330: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
f340: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
f350: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
f360: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
f370: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
f380: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
f390: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
f3a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f3b0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
f3c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
f3d0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
f3e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f3f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
f400: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
f410: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
f420: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
f430: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
f440: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
f450: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
f460: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
f470: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
f480: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
f490: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
f4a0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
f4b0: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
f4c0: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
f4d0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
f4e0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
f4f0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
f500: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
f510: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
f520: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
f530: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
f540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f550: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
f560: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
f570: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
f580: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
f590: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f5a0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
f5b0: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
f5c0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
f5d0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
f5e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
f5f0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
f600: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f610: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
f620: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
f630: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
f640: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
f650: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
f660: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
f670: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
f680: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
f690: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
f6a0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
f6b0: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
f6c0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
f6d0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
f6e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
f6f0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f700: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f710: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
f720: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
f730: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f740: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f750: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
f760: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
f770: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
f780: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f790: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f7a0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
f7b0: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
f7c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
f7d0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
f7e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
f7f0: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
f800: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
f810: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
f820: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
f830: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
f840: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
f850: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
f860: 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
f870: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
f880: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eader */..    /*
f890: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
f8a0: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
f8b0: 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
f8c0: 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
f8d0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f8e0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
f8f0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
f900: 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
f910: 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
f920: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
f930: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
f940: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
f950: 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
f960: 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
f970: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f980: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f  }..    /* Versio
f990: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
f9a0: 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20  or to 3.5.8 set 
f9b0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69  the page-size fi
f9c0: 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  eld of the.    *
f9d0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
f9e0: 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   to zero. In thi
f9f0: 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74  s case, assume t
fa00: 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61  hat the Pager.pa
fa10: 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61  geSize.    ** va
fa20: 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64  riable is alread
fa30: 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72  y set to the cor
fa40: 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a  rect page size..
fa50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
fa60: 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  PageSize==0 ){. 
fa70: 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d       iPageSize =
fa80: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
fa90: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
faa0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
fab0: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
fac0: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
fad0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
fae0: 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
faf0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
fb00: 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
fb10: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
fb20: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
fb30: 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
fb40: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
fb50: 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
fb60: 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
fb70: 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
fb80: 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
fb90: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
fba0: 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
fbb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
fbc0: 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
fbd0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
fbe0: 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
fbf0: 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
fc00: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
fc10: 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
fc20: 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
fc30: 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
fc40: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
fc50: 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
fc60: 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
fc70: 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
fc80: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
fc90: 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
fca0: 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
fcb0: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
fcc0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
fcd0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
fce0: 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
fcf0: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
fd00: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
fd10: 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
fd20: 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
fd30: 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
fd40: 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
fd50: 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
fd60: 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
fd70: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
fd80: 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
fd90: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
fda0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
fdb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
fdc0: 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
fdd0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
fde0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
fdf0: 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
fe00: 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
fe10: 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
fe20: 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
fe30: 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
fe40: 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
fe50: 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
fe60: 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
fe70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
fe80: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
fe90: 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
fea0: 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  e, -1);.    test
feb0: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
fec0: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  _OK );..    /* U
fed0: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
fee0: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
fef0: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
ff00: 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
ff10: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
ff20: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
ff30: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
ff40: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
ff50: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
ff60: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
ff70: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
ff80: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
ff90: 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
ffa0: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
ffb0: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
ffc0: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
ffd0: 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
ffe0: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
fff0: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
10000 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
10010 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
10020 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
10030 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
10040 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
10050 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
10060 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
10070 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
10080 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
10090 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
100a0 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
100b0 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
100c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
100d0 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
100e0 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
100f0 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
10100 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10110 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
10120 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
10130 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
10140 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
10150 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
10160 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
10170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
10180 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
10190 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
101a0 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
101b0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
101c0 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
101d0 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
101e0 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
101f0 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
10200 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
10210 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
10220 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
10230 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
10240 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
10250 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10260 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
10270 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
10280 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
10290 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
102a0 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
102b0 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
102c0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
102d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
102e0 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
102f0 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
10300 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
10310 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
10320 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
10330 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
10340 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
10350 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
10360 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
10370 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
10380 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
10390 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
103a0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
103b0 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
103c0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
103d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
103e0 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
103f0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
10400 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10410 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
10420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10440 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
10450 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
10480 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
10490 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
104c0 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
104d0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
104e0 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
104f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10500 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
10510 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
10520 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
10550 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
10560 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
10570 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
10580 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10590 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
105a0 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  ger) );..  if( !
105b0 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70  zMaster .   || p
105c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
105d0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
105e0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
105f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
10600 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
10610 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
10620 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
10630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10640 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
10650 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
10660 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
10670 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
10680 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
10690 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
106a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a  >journalOff );..
106b0 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
106c0 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74  he length in byt
106d0 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  es and the check
106e0 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a  sum of zMaster *
106f0 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d  /.  for(nMaster=
10700 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  0; zMaster[nMast
10710 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b  er]; nMaster++){
10720 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
10730 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a  aster[nMaster];.
10740 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
10750 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10760 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
10770 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
10780 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
10790 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
107a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
107b0 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
107c0 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
107d0 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
107e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
107f0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
10800 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
10810 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
10820 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
10830 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
10840 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
10850 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72  ger);.  }.  iHdr
10860 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
10870 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
10880 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
10890 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f   journal data to
108a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
108b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
108c0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
108d0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68  ccurs, return th
108e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
108f0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f  the caller..  */
10900 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63  .  if( (0 != (rc
10910 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
10920 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10930 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
10940 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20  NO(pPager)))).  
10950 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10960 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
10970 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
10980 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48  ter, nMaster, iH
10990 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c  drOff+4))).   ||
109a0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
109b0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
109c0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
109d0 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  nMaster, nMaster
109e0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
109f0 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
10a00 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10a10 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10a20 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20  +4, cksum))).   
10a30 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
10a40 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
10a50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
10a60 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64  nalMagic, 8, iHd
10a70 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
10a80 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
10a90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
10aa0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10ab0 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
10ac0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
10ad0 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
10ae0 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
10af0 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
10b00 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
10b10 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
10b20 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
10b30 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
10b40 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
10b50 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
10b60 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
10b70 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
10b80 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
10b90 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
10ba0 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
10bb0 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
10bc0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
10bd0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
10be0 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
10bf0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
10c00 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
10c10 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
10c20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
10c30 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
10c40 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
10c50 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
10c60 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
10c70 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
10c80 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
10c90 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
10ca0 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
10cb0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
10cc0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10cd0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
10ce0 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
10cf0 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
10d00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
10d10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
10d20 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
10d30 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
10d40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
10d50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
10d70 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
10d80 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
10d90 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
10da0 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
10db0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
10dc0 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
10dd0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10de0 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
10df0 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
10e00 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
10e10 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
10e20 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
10e30 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10e60 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
10e70 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
10e80 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
10e90 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
10ea0 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
10eb0 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
10ec0 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
10ed0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
10ee0 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
10ef0 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
10f00 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
10f10 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
10f20 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
10f30 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
10f40 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
10f50 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
10f60 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10f70 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
10f80 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
10f90 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
10fa0 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
10fb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  ){.  sqlite3Back
10fc0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
10fd0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71  ->pBackup);.  sq
10fe0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
10ff0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11000 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
11010 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11020 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11030 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11040 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11050 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11060 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11070 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11080 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11090 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
110a0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
110b0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
110c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
110d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
110e0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
110f0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11100 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11120 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11130 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11140 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11150 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11160 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11170 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11180 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11190 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
111a0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
111b0 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
111c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
111d0 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
111e0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
111f0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
11200 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11210 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11220 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11230 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
11240 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11250 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11260 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11270 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11280 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11290 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
112a0 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
112b0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
112c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
112d0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
112e0 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
112f0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11310 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11320 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11330 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11340 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11350 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11360 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11370 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11380 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11390 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
113a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
113b0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
113c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
113d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
113e0 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
113f0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11400 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11410 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11420 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11430 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11440 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11450 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11460 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11470 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11480 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11490 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
114a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
114b0 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
114c0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
114d0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
114e0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
114f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11500 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11510 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11520 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  p if the pager i
11530 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
11540 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69  ode and not.** i
11550 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
11560 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
11570 20 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61   switches the pa
11580 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ger to PAGER_OPE
11590 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  N.** state..**.*
115a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
115b0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
115c0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20  ve-access mode, 
115d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
115e0 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  e is.** complete
115f0 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20  ly unlocked. If 
11600 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
11610 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c  cked and the fil
11620 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a  e-system does.**
11630 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65   not exhibit the
11640 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45   UNDELETABLE_WHE
11650 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c  N_OPEN property,
11660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11670 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28  e is.** closed (
11680 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a  if it is open)..
11690 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
116a0 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73  er is in ERROR s
116b0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
116c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
116d0 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  d, the .** conte
116e0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
116f0 20 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61   cache are disca
11700 72 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74  rded before swit
11710 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a  ching back to .*
11720 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  * the OPEN state
11730 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
11740 77 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65  whether the page
11750 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11760 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74  e-mode.** or not
11770 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  , any journal fi
11780 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  le left in the f
11790 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20  ile-system will 
117a0 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73  be treated.** as
117b0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
117c0 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  nd rolled back t
117d0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72  he next time a r
117e0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
117f0 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79  ** is opened (by
11800 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20   this or by any 
11810 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11820 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
11830 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
11840 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
11850 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11860 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11870 52 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c  READER .       |
11880 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11890 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20  ==PAGER_OPEN .  
118a0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
118b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
118c0 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c  ROR .  );..  sql
118d0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
118e0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
118f0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
11900 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
11910 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
11920 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
11930 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
11940 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
11950 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11960 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
11970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
11980 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
11990 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
119a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
119b0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
119c0 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
119d0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
119e0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
119f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
11a10 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
11a20 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
11a30 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
11a40 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
11a50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
11a60 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
11a70 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
11a80 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
11a90 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
11aa0 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
11ab0 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
11ac0 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
11ad0 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
11ae0 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
11af0 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
11b00 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
11b10 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
11b20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11b30 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
11b40 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
11b50 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
11b60 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
11b70 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
11b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11b90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11ba0 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
11bb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11bc0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11bd0 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
11be0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11bf0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11c00 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
11c10 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
11c20 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11c30 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
11c40 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11c50 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11c60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
11c70 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
11c80 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11c90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
11ca0 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
11cb0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
11cc0 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
11cd0 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
11ce0 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
11cf0 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
11d00 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
11d10 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
11d20 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
11d30 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
11d40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
11d50 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
11d60 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
11d70 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
11d80 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
11d90 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
11da0 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
11db0 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
11dc0 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
11dd0 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
11de0 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
11df0 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
11e00 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
11e10 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
11e20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
11e30 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
11e40 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
11e50 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
11e60 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
11e70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
11e80 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11e90 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
11ea0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
11eb0 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
11ec0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
11ed0 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
11ee0 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
11ef0 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
11f00 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
11f10 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
11f20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
11f30 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
11f40 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
11f50 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
11f60 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
11f70 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
11f80 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
11f90 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
11fa0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11fb0 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
11fc0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
11fd0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
11fe0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
11ff0 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
12000 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12010 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12020 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
12030 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12040 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
12050 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12060 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
12070 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
12080 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
12090 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
120a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
120b0 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
120c0 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
120d0 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
120e0 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
120f0 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
12100 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
12110 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12120 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  de..  */.  if( p
12130 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12140 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
12150 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
12160 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12170 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
12180 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
12190 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
121a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
121b0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
121c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
121d0 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
121e0 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  K;.  }..  pPager
121f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
12200 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
12210 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50  nalHdr = 0;.  pP
12220 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
12230 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
12240 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
12250 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
12260 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20  n IOERR or FULL 
12270 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69  error that requi
12280 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  res.** the pager
12290 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69   to transition i
122a0 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
122b0 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63  ate may ahve occ
122c0 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69  urred..** The fi
122d0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
122e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
122f0 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
12300 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  , the second .**
12310 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
12320 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
12330 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
12340 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  API function. Th
12350 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75  e .** value retu
12360 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
12370 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
12380 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
12390 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
123a0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
123b0 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
123c0 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45  FULL, SQLITE_IOE
123d0 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  RR or one of the
123e0 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f  .** IOERR sub-co
123f0 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65  des, the pager e
12400 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20  nters the ERROR 
12410 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72  state and the er
12420 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73  ror code.** is s
12430 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65  tored in Pager.e
12440 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68  rrCode. While th
12450 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20  e pager remains 
12460 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
12470 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72  te,.** all major
12480 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
12490 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d  e Pager will imm
124a0 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
124b0 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a  Pager.errCode..*
124c0 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73  *.** The ERROR s
124d0 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74  tate indicates t
124e0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
124f0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
12500 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
12510 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
12520 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
12530 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
12540 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
12550 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
12560 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12570 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
12580 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
12590 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
125a0 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
125b0 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
125c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
125d0 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
125e0 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
125f0 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
12600 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
12610 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
12620 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
12630 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
12640 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
12650 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
12660 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
12670 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
12680 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
12690 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
126a0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
126b0 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
126c0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
126d0 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
126e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
126f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
12700 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
12710 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
12720 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
12730 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
12740 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
12750 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
12760 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12770 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50  ode = rc;.    pP
12780 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12790 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  AGER_ERROR;.  }.
127a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
127b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
127c0 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
127d0 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63  ction. A transac
127e0 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20  tion is usually 
127f0 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74  ended by .** eit
12800 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  her a COMMIT or 
12810 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61  a ROLLBACK opera
12820 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69  tion. This routi
12830 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ne may be called
12840 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62   .** after rollb
12850 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ack of a hot-jou
12860 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  rnal, or if an e
12870 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
12880 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65  e opening.** the
12890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
128a0 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72   writing the ver
128b0 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  y first journal-
128c0 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64  header of a.** d
128d0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
128e0 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ion..** .** This
128f0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
12900 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45  r called in PAGE
12910 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49  R_ERROR state. I
12920 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a  f it is called.*
12930 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20  * in PAGER_NONE 
12940 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  or PAGER_SHARED 
12950 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f  state and the lo
12960 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a  ck held is less.
12970 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61  ** exclusive tha
12980 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
12990 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  k, it is a no-op
129a0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
129b0 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61  e, any active sa
129c0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c  vepoints are rel
129d0 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eased..**.** If 
129e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
129f0 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69   is open, then i
12a00 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22  t is "finalized"
12a10 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c  . Once a journal
12a20 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65   .** file has be
12a30 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20  en finalized it 
12a40 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
12a50 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c  to use it to rol
12a60 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61  l back a .** tra
12a70 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69  nsaction. Nor wi
12a80 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65  ll it be conside
12a90 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d  red to be a hot-
12aa0 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a  journal by this.
12ab0 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  ** or any other 
12ac0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12ad0 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ion. Exactly how
12ae0 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69   a journal is fi
12af0 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e  nalized.** depen
12b00 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
12b10 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69   not the pager i
12b20 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
12b30 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a  lusive mode and.
12b40 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a  ** the current j
12b50 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67  ournal-mode (Pag
12b60 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76  er.journalMode v
12b70 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77  alue), as follow
12b80 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s:.**.**   journ
12b90 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a  alMode==MEMORY.*
12ba0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12bb0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
12bc0 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20   simply closed. 
12bd0 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e  This destroys an
12be0 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f   .**     in-memo
12bf0 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  ry journal..**.*
12c00 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12c10 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  =TRUNCATE.**    
12c20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   Journal file is
12c30 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
12c40 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
12c50 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
12c60 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a  lMode==PERSIST.*
12c70 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20  *     The first 
12c80 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  28 bytes of the 
12c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65  journal file are
12ca0 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e   zeroed. This in
12cb0 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20  validates.**    
12cc0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
12cd0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
12ce0 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65   file, and hence
12cf0 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
12d00 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e  nal.**     file.
12d10 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72   An invalid jour
12d20 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20  nal file cannot 
12d30 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
12d40 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
12d50 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20  ode==DELETE.**  
12d60 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66     The journal f
12d70 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ile is closed an
12d80 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  d deleted using 
12d90 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
12da0 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  )..**.**     If 
12db0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
12dc0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
12dd0 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74  e mode, this met
12de0 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  hod of finalizin
12df0 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  g.**     the jou
12e00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
12e10 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64  er used. Instead
12e20 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
12e30 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44  Mode is.**     D
12e40 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61  ELETE and the pa
12e50 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
12e60 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65  ive mode, the me
12e70 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75  thod described u
12e80 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  nder.**     jour
12e90 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
12ea0 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
12eb0 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
12ec0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  e journal is fin
12ed0 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65  alized, the page
12ee0 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52  r moves to PAGER
12ef0 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a  _READER state..*
12f00 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
12f10 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f  non-exclusive ro
12f20 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65  llback mode, the
12f30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
12f40 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61  e is .** downgra
12f50 64 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f  ded to a SHARED_
12f60 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  LOCK..**.** SQLI
12f70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
12f80 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
12f90 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
12fa0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a  r occurs during.
12fb0 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f  ** any of the IO
12fc0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66   operations to f
12fd0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
12fe0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f  nal file or unlo
12ff0 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
13000 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  se then the IO e
13010 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
13020 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
13030 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70  r. If the .** op
13040 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c  eration to final
13050 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
13060 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e  file fails, then
13070 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a   the code still.
13080 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f  ** tries to unlo
13090 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
130a0 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65  file if not in e
130b0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49  xclusive mode. I
130c0 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20  f the.** unlock 
130d0 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20  operation fails 
130e0 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68  as well, then th
130f0 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f  e first error co
13100 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f  de related.** to
13110 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
13120 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68   encountered (th
13130 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  e journal finali
13140 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a  zation one) is.*
13150 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
13160 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13170 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
13180 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
13190 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20  nt hasMaster){. 
131a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
131b0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72  _OK;      /* Err
131c0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75  or code from jou
131d0 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
131e0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
131f0 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
13200 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72  E_OK;     /* Err
13210 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20  or code from db 
13220 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  file unlock oper
13230 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44  ation */..  /* D
13240 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65  o nothing if the
13250 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
13260 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
13270 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  te transaction. 
13280 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20   ** or at least 
13290 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
132a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
132b0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ay be called whe
132c0 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  n there.  ** is 
132d0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
132e0 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20  tion active but 
132f0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
13300 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20  eater lock is.  
13310 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77  ** held under tw
13320 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
13330 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
13340 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  After a successf
13350 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ul hot-journal r
13360 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63  ollback, it is c
13370 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  alled with.  ** 
13380 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47       eState==PAG
13390 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63  ER_NONE and eLoc
133a0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
133b0 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  K..  **.  **   2
133c0 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f  . If a connectio
133d0 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d  n with locking_m
133e0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f  ode=exclusive ho
133f0 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
13400 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f  VE .  **      lo
13410 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63 6b  ck switches back
13420 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   to locking_mode
13430 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e  =normal and then
13440 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a   executes a.  **
13450 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73        read-trans
13460 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e  action, this fun
13470 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
13480 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47  with eState==PAG
13490 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20  ER_READER .  ** 
134a0 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d       and eLock==
134b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77  EXCLUSIVE_LOCK w
134c0 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61  hen the read-tra
134d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
134e0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
134f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
13500 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
13510 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13520 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
13530 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20  _ERROR );.  if( 
13540 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
13550 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
13560 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  ED && pPager->eL
13570 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43  ock<RESERVED_LOC
13580 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
13590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
135a0 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
135b0 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
135c0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
135d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
135e0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
135f0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nal==0 );.  if( 
13600 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13610 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
13620 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
13630 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
13640 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
13650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
13660 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13670 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
13680 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13690 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
136a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
136b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
136c0 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20  E_MEMORY );.    
136d0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
136e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
136f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13700 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13710 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13720 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
13730 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
13740 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
13750 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13780 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
13790 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
137a0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, 0);.      }.
137b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
137c0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
137d0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
137e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
137f0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13800 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
13810 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
13820 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
13830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13840 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
13850 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
13860 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
13870 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
13880 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20  r, hasMaster);. 
13890 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
138a0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
138b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
138c0 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79   This branch may
138d0 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
138e0 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  h Pager.journalM
138f0 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20  ode==MEMORY if. 
13900 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f       ** a hot-jo
13910 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72  urnal was just r
13920 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74  olled back. In t
13930 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
13940 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
13950 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  le should be clo
13960 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e  sed and deleted.
13970 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   If this connect
13980 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20  ion writes to.  
13990 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
139a0 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c  ase file, it wil
139b0 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e  l do so using an
139c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
139d0 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  al. .      */.  
139e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
139f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13a00 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13a10 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13a20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13a30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13a40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13a50 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13a60 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13a70 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13a80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13a90 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13aa0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13ab0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13ac0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
13ad0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
13ae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13af0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13b00 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
13b10 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
13b20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13b30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
13b40 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
13b50 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
13b60 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
13b70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
13b80 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
13b90 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
13ba0 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
13bb0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
13bc0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
13bd0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
13be0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
13bf0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
13c00 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
13c10 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
13c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
13c30 65 72 55 6e 72 65 66 28 70 29 3b 0a 20 20 20 20  erUnref(p);.    
13c40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13c50 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
13c60 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
13c70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
13c80 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
13c90 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
13ca0 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ec = 0;.  sqlite
13cb0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
13cc0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13cd0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13ce0 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
13cf0 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
13d00 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69  r->dbSize);..  i
13d10 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
13d20 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
13d30 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72   Drop the WAL wr
13d40 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79  ite-lock, if any
13d50 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63  . Also, if the c
13d60 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e  onnection was in
13d70 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   .    ** locking
13d80 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13d90 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c  mode but is no l
13da0 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20  onger, drop the 
13db0 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a  EXCLUSIVE .    *
13dc0 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  * lock held on t
13dd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13de0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32  ..    */.    rc2
13df0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64   = sqlite3WalEnd
13e00 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
13e10 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
13e20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 32 3d      assert( rc2=
13e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
13e40 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
13e50 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
13e60 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
13e70 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
13e80 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
13e90 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
13ea0 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
13eb0 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
13ec0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
13ed0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
13ee0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13ef0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
13f00 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
13f10 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
13f20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
13f30 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
13f40 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
13f50 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
13f60 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
13f70 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
13f80 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
13f90 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
13fa0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
13fb0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
13fc0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
13fd0 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
13fe0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
13ff0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
14000 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
14010 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
14020 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
14030 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
14040 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
14050 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
14060 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
14070 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
14080 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
14090 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
140a0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
140b0 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
140c0 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
140d0 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
140e0 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
140f0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
14100 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
14110 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
14120 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
14130 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
14140 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
14150 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
14160 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
14170 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
14180 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
14190 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
141a0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
141b0 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
141c0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
141d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
141e0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
141f0 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
14200 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
14210 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14220 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
14230 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
14240 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
14250 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14260 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
14270 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
14280 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
14290 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
142a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
142b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
142c0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
142d0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
142e0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
142f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
14300 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14310 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
14320 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14330 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
14340 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
14350 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14360 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14370 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14380 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
143a0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
143b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
143c0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
143d0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
143e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
143f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14400 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
14410 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
14420 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
14430 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
14440 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
14450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
14460 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
14470 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14480 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
14490 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
144a0 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
144b0 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
144c0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
144d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
144e0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
144f0 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
14500 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
14510 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
14520 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
14530 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
14540 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
14550 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
14560 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
14570 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
14580 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
14590 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
145a0 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
145b0 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
145c0 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
145d0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
145e0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
145f0 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
14600 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
14610 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
14620 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
14630 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
14640 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
14650 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
14660 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
14670 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
14680 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
14690 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
146a0 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
146b0 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
146c0 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
146d0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
146e0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
146f0 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
14700 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
14710 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
14720 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
14730 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
14740 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
14750 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
14760 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
14770 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
14780 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
14790 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
147a0 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
147b0 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
147c0 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
147d0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
147e0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
147f0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
14800 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
14810 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
14820 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
14830 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
14840 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
14850 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
14860 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
14870 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
14880 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
14890 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
148a0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
148b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
148c0 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
148d0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
148e0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
148f0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
14900 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
14910 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
14920 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
14930 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
14940 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
14950 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
14960 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
14970 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
14980 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
14990 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
149a0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
149b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
149c0 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
149d0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
149e0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
149f0 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
14a00 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
14a30 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
14a40 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
14a50 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
14a60 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
14a70 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
14a80 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
14a90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
14aa0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
14ab0 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
14ac0 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
14ad0 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
14ae0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
14af0 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
14b00 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
14b10 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
14b20 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
14b30 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
14b40 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
14b50 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
14b60 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
14b70 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
14b80 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
14b90 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
14ba0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
14bb0 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
14bc0 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
14bd0 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
14be0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
14bf0 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
14c00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14c10 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
14c20 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
14c30 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
14c40 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
14c50 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
14c60 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
14c70 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
14c80 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
14c90 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
14ca0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
14cb0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
14cc0 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
14cd0 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
14ce0 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
14cf0 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
14d00 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
14d10 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
14d20 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
14d30 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
14d40 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
14d50 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
14d60 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
14d70 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
14d80 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
14d90 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
14da0 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
14db0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
14dc0 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
14dd0 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
14de0 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
14df0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
14e00 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
14e10 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
14e20 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
14e30 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
14e40 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
14e50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
14e60 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
14e70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
14e80 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
14e90 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
14ea0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
14eb0 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
14ec0 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
14ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
14ee0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
14ef0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
14f00 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
14f10 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
14f20 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
14f30 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
14f40 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
14f50 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
14f60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
14f70 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
14f80 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
14f90 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
14fa0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
14fb0 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
14fc0 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
14fd0 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
14fe0 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
14ff0 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
15000 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
15010 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
15020 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
15030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15040 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
15050 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
15060 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
15070 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
15080 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
15090 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
150a0 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
150b0 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
150c0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
150d0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
150e0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
150f0 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
15100 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
15110 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
15120 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
15130 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
15140 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
15150 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
15160 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
15170 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
15180 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15190 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
151a0 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
151b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
151c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
151d0 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
151e0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
151f0 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15210 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
15220 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
15230 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
15260 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
15270 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
15280 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
15290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
152a0 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
152b0 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
152c0 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
152d0 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
152e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
152f0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15300 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
15310 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
15320 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
15330 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
15340 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
15350 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
15360 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
15370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15380 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
15390 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
153a0 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
153b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
153c0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
153d0 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
153e0 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
153f0 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15410 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
15420 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
15430 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
15440 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
15450 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
15460 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
15470 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
15480 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
154b0 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
154c0 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
154d0 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29   (isMainJrnl&~1)
154e0 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69  ==0 );      /* i
154f0 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f  sMainJrnl is 0 o
15500 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
15510 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d   (isSavepnt&~1)=
15520 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69  =0 );       /* i
15530 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72  sSavepnt is 0 or
15540 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
15550 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44  isMainJrnl || pD
15560 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44  one );     /* pD
15570 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20  one always used 
15580 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  on sub-journals 
15590 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
155a0 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
155b0 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65  =0 );   /* pDone
155c0 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e   never used on n
155d0 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  on-savepoint */.
155e0 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65  .  aData = pPage
155f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
15600 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
15610 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
15620 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
15630 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
15640 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61  allocated */.  a
15650 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
15660 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
15670 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26   (!isMainJrnl &&
15680 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a   isSavepnt) );..
15690 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
156a0 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72  state is greater
156b0 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54   than PAGER_WRIT
156c0 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74  ER_CACHEMOD (a t
156d0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
156e0 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f   or savepoint ro
156f0 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74  llback done at t
15700 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68  he request of th
15710 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69  e caller) or thi
15720 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  s is.  ** a hot-
15730 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
15740 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74  . If it is a hot
15750 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
15760 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  k, the pager.  *
15770 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50  * is in state OP
15780 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20  EN and holds an 
15790 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
157a0 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  Hot-journal roll
157b0 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72  back.  ** only r
157c0 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  eads from the ma
157d0 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20  in journal, not 
157e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
157f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15800 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
15810 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15820 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
15830 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
15840 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70  =PAGER_OPEN && p
15850 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
15860 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
15870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
15880 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
15890 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
158a0 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c  OD || isMainJrnl
158b0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
158c0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
158d0 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
158e0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
158f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
15900 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
15910 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
15920 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
15930 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
15940 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
15950 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
15960 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
15970 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
15980 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
15990 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
159a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
159b0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
159c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
159d0 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
159e0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
159f0 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
15a00 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
15a10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
15a20 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
15a30 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
15a40 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
15a50 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
15a60 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
15a70 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
15a80 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
15a90 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
15aa0 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
15ab0 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
15ac0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
15ad0 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
15ae0 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
15af0 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
15b00 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
15b10 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
15b20 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
15b30 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
15b40 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
15b50 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
15b60 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
15b70 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
15b80 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
15b90 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
15ba0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
15bb0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
15bc0 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
15bd0 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
15be0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
15bf0 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
15c00 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
15c10 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
15c20 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
15c30 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
15c40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15c50 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
15c60 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
15c70 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
15c80 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
15c90 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
15ca0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
15cb0 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
15cc0 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
15cd0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
15ce0 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
15cf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15d00 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
15d10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
15d20 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
15d30 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79  y been played by
15d40 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
15d50 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
15d60 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
15d70 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
15d80 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
15d90 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
15da0 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
15db0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
15dc0 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
15dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15de0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
15df0 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
15e00 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
15e10 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
15e20 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
15e30 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
15e40 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15e50 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
15e60 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
15e70 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
15e80 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
15e90 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
15ea0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
15eb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
15ec0 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
15ed0 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
15ee0 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
15ef0 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
15f00 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
15f10 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
15f20 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
15f30 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
15f40 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
15f50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
15f60 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
15f70 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
15f80 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
15f90 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
15fa0 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
15fb0 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
15fc0 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
15fd0 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
15fe0 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
15ff0 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
16000 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
16010 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
16020 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
16030 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
16040 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
16050 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
16060 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
16070 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
16080 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
16090 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
160a0 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
160b0 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
160c0 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
160d0 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
160e0 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
160f0 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
16100 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
16110 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
16120 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
16130 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
16140 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
16150 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
16160 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
16170 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
16180 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
16190 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
161a0 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
161b0 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
161c0 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
161d0 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
161e0 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
161f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16200 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
16210 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
16220 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
16230 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
16240 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
16250 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
16260 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
16270 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
16280 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
16290 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
162a0 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
162b0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
162c0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
162d0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
162e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
162f0 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
16300 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
16310 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
16320 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
16330 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
16340 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
16350 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
16360 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
16370 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
16380 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
16390 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
163a0 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
163b0 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
163c0 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
163d0 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
163e0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
163f0 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
16400 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
16410 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
16420 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
16430 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
16440 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
16450 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
16460 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
16470 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
16480 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
16490 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
164a0 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
164b0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
164c0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
164d0 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
164e0 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
164f0 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
16500 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
16510 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
16520 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
16530 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
16540 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
16550 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
16560 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
16570 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
16580 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
16590 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
165a0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
165b0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
165c0 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
165d0 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
165e0 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
165f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
16600 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
16610 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
16620 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
16630 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
16640 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
16650 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
16660 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
16670 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
16680 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
16690 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
166a0 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
166b0 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
166c0 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
166d0 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
166e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
166f0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
16700 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
16710 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
16720 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
16730 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
16740 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
16750 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
16760 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
16770 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20   || pPg==0 );.  
16780 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
16790 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
167a0 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
167b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41  ",.           PA
167c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
167d0 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
167e0 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
167f0 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61  Size, (u8*)aData
16800 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69  ),.           (i
16810 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
16820 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
16830 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
16840 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
16850 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
16860 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
16870 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20  || (*pOffset <= 
16880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
16890 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
168a0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50    isSynced = (pP
168b0 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
168c0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
168d0 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a  EED_SYNC));.  }.
168e0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
168f0 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28  ger->fd).   && (
16900 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16910 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
16920 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
16930 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
16940 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64  ).   && isSynced
16950 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
16960 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
16970 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
16980 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ize;.    testcas
16990 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  e( !isSavepnt &&
169a0 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d   pPg!=0 && (pPg-
169b0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
169c0 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20  D_SYNC)!=0 );.  
169d0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
169e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
169f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
16a00 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
16a10 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  ->fd, (u8*)aData
16a20 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16a30 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
16a40 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
16a50 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
16a60 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
16a70 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
16a80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
16a90 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
16aa0 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
16ab0 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
16ac0 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
16ad0 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
16ae0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
16af0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
16b00 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
16b10 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
16b20 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
16b30 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
16b40 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
16b50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
16b60 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
16b70 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
16b80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16b90 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
16ba0 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
16bb0 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
16bc0 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
16bd0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
16be0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
16bf0 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
16c00 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
16c10 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
16c20 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
16c30 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
16c40 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
16c50 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
16c60 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
16c70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
16c80 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
16c90 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
16ca0 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
16cb0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
16cc0 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
16cd0 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
16ce0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
16cf0 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
16d00 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
16d10 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
16d20 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
16d30 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
16d40 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
16d50 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
16d60 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
16d70 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
16d80 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
16d90 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
16da0 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
16db0 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
16dc0 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
16dd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
16de0 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
16df0 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
16e00 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
16e10 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
16e20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
16e30 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
16e40 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
16e50 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
16e60 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
16e70 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
16e80 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
16e90 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
16ea0 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
16eb0 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
16ec0 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
16ed0 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
16ee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
16ef0 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
16f00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
16f10 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
16f20 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
16f30 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b 2b 3b  r->doNotSpill++;
16f40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16f50 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50  3PagerAcquire(pP
16f60 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67  ager, pgno, &pPg
16f70 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
16f80 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
16f90 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70  pill==1 );.    p
16fa0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
16fb0 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21  l--;.    if( rc!
16fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16fd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d  urn rc;.    pPg-
16fe0 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
16ff0 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
17000 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
17010 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
17020 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
17030 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
17040 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
17050 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
17060 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
17070 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
17080 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
17090 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
170a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
170b0 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
170c0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
170d0 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
170e0 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
170f0 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
17100 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
17110 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
17120 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
17130 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
17140 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
17150 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
17160 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
17170 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
17180 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
17190 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
171a0 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a  mcpy(pData, (u8*
171b0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
171c0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  pageSize);.    p
171d0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
171e0 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69  (pPg);.    if( i
171f0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
17200 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66  sSavepnt || *pOf
17210 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  fset<=pPager->jo
17220 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
17230 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
17240 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
17250 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
17260 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
17270 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
17280 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
17290 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
172a0 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
172b0 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
172c0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
172d0 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
172e0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
172f0 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
17300 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
17310 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
17320 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
17330 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
17340 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  out to the.     
17350 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
17360 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17370 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63  There is one exc
17380 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  eption to this r
17390 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ule. If the page
173a0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
173b0 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61  .      ** back a
173c0 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65  s part of a save
173d0 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d  point (or statem
173e0 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72  ent) rollback fr
173f0 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  om an .      ** 
17400 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
17410 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
17420 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
17430 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20  it is not safe. 
17440 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20       ** to mark 
17450 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
17460 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  n. This is becau
17470 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70  se marking the p
17480 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20  age as.      ** 
17490 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72  clean will clear
174a0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
174b0 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65  SYNC flag. Since
174c0 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20   the page is.   
174d0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e     ** already in
174e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
174f0 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50  e (recorded in P
17500 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ager.pInJournal)
17510 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
17520 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
17530 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65  C flag is cleare
17540 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  d, if the page i
17550 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  s written to.   
17560 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
17570 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
17580 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
17590 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
175a0 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  but.      ** the
175b0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
175c0 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62   flag will not b
175d0 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20  e set. It could 
175e0 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79  then potentially
175f0 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69  .      ** be wri
17600 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68  tten out into th
17610 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17620 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e  before its journ
17630 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  al file.      **
17640 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63   segment is sync
17650 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f  ed. If a crash o
17660 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20  ccurs during or 
17670 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a  following this,.
17680 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
17690 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  e corruption may
176a0 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f   ensue..      */
176b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
176c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
176d0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  er) );.      sql
176e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
176f0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ean(pPg);.    }.
17700 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
17710 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20  gehash(pPg);..  
17720 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
17730 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
17740 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
17750 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
17760 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
17770 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
17780 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
17790 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
177a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
177b0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
177c0 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
177d0 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
177e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
177f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
17800 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
17810 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
17820 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
17830 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
17840 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
17850 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
17860 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17870 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
17880 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17890 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
178a0 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
178b0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
178c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
178d0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
178e0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
178f0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
17900 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
17910 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
17920 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
17930 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
17940 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
17950 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
17960 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17970 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
17980 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
17990 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
179a0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
179b0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
179c0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
179d0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
179e0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
179f0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
17a00 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
17a10 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
17a20 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
17a30 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
17a40 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
17a50 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
17a60 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
17a70 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
17a80 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
17a90 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
17aa0 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
17ab0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
17ac0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
17ad0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
17ae0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
17af0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
17b00 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
17b10 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
17b20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
17b30 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
17b40 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
17b50 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
17b60 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
17b70 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
17b80 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
17b90 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
17ba0 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
17bb0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
17bc0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
17bd0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
17be0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
17bf0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
17c00 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
17c10 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
17c20 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
17c30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
17c40 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
17c50 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
17c60 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
17c70 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
17c80 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
17c90 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
17ca0 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
17cb0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
17cc0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
17cd0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
17ce0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
17cf0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
17d00 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
17d10 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
17d20 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
17d30 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
17d40 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
17d50 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
17d60 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
17d70 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
17d80 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
17d90 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
17da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
17db0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
17dc0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
17dd0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
17de0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
17df0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
17e00 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
17e10 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
17e20 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
17e30 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
17e40 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
17e50 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
17e60 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
17e70 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
17e80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
17e90 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
17ea0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
17eb0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
17ec0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
17ed0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
17ee0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
17ef0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
17f00 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
17f10 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
17f20 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
17f30 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
17f40 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
17f50 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
17f60 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
17f70 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
17f80 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
17f90 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
17fa0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
17fb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17fc0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
17fd0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
17fe0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
17ff0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
18000 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
18010 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
18020 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18030 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
18040 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
18050 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
18060 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
18070 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
18080 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
180b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
180c0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
180d0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
180e0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
180f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
18100 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
18110 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
18120 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
18130 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18140 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
18150 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
18160 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
18170 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18180 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
18190 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
181a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
181b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
181c0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
181d0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
181e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
181f0 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
18200 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
18210 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
18220 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
18230 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
18240 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
18250 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18260 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
18270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
18280 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
18290 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
182a0 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
182b0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
182c0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
182d0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
182e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
182f0 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
18300 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
18310 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18320 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
18330 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
18340 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
18350 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
18360 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
18370 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
18380 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
18390 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
183a0 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
183b0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
183c0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
183d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
183e0 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
183f0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
18400 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
18410 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
18420 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
18430 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
18440 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
18450 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
18460 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
18470 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
18480 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18490 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
184a0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
184b0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
184c0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
184d0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
184e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
184f0 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
18500 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
18510 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f  ournal.   Also o
18520 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69  btain.  ** suffi
18530 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20  cient space (in 
18540 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68  zMasterPtr) to h
18550 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  old the names of
18560 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75   master.  ** jou
18570 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61  rnal files extra
18580 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61  cted from regula
18590 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  r rollback-journ
185a0 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  als..  */.  rc =
185b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
185c0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
185d0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
185e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
185f0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18600 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65  er_out;.  nMaste
18610 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50  rPtr = pVfs->mxP
18620 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61  athname+1;.  zMa
18630 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  sterJournal = sq
18640 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
18650 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
18660 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
18670 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  );.  if( !zMaste
18680 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
18690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
186a0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  M;.    goto delm
186b0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20  aster_out;.  }. 
186c0 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a   zMasterPtr = &z
186d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
186e0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b  asterJournal+1];
186f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
18700 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
18710 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28  MasterJournal, (
18720 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
18730 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  al, 0);.  if( rc
18740 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18750 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18760 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
18770 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
18780 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72  l] = 0;..  zJour
18790 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
187a0 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  rnal;.  while( (
187b0 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
187c0 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
187d0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
187e0 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72  nt exists;.    r
187f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
18800 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
18810 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
18820 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
18830 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
18840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18850 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
18860 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
18870 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20   if( exists ){. 
18880 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
18890 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
188a0 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
188b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
188c0 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70  sts..      ** Op
188d0 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
188e0 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
188f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18900 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  al. If.      ** 
18910 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
18920 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
18930 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18940 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ile..      */.  
18950 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
18960 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
18970 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18980 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
18990 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
189a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
189b0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
189c0 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
189d0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
189e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
189f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
18a00 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18a10 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
18a20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
18a30 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61  rJournal(pJourna
18a40 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e  l, zMasterPtr, n
18a50 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
18a60 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18a70 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
18a80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18a90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
18aa0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18ab0 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
18ac0 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
18ad0 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70  [0]!=0 && strcmp
18ae0 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
18af0 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
18b00 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
18b10 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
18b20 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
18b30 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
18b40 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
18b50 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
18b60 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
18b70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f   }.    }.    zJo
18b80 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65  urnal += (sqlite
18b90 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e  3Strlen30(zJourn
18ba0 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20  al)+1);.  }. .  
18bb0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
18bc0 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20  Master);.  rc = 
18bd0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
18be0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
18bf0 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
18c00 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
18c10 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
18c20 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72  );.  if( pMaster
18c30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
18c40 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
18c50 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
18c60 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29  Open(pJournal) )
18c70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
18c80 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(pMaster);.  }
18c90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18ca0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
18cb0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
18cc0 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75   change the actu
18cd0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
18ce0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
18cf0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
18d00 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68  tem. This only h
18d10 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d  appens when comm
18d20 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
18d30 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c  tion,.** or roll
18d40 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73  ing back a trans
18d50 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e  action (includin
18d60 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  g rolling back a
18d70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
18d80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e  *.** If the main
18d90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
18da0 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74  s not open, or t
18db0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
18dc0 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d  in either.** DBM
18dd0 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65  OD or OPEN state
18de0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18df0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
18e00 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20  rwise, the size 
18e10 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20  .** of the file 
18e20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50  is changed to nP
18e30 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65  age pages (nPage
18e40 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
18e50 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66  e bytes). .** If
18e60 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
18e70 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c  k is currently l
18e80 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65  arger than nPage
18e90 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65   pages, then use
18ea0 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75   the VFS.** xTru
18eb0 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74  ncate() method t
18ec0 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a  o truncate it..*
18ed0 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68  *.** Or, it migh
18ee0 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
18ef0 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ase that the fil
18f00 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61  e on disk is sma
18f10 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50  ller than .** nP
18f20 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20  age pages. Some 
18f30 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
18f40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
18f50 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
18f60 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79  d if .** you try
18f70 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66   to truncate a f
18f80 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
18f90 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
18fa0 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72  than it .** curr
18fb0 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74  ently is, so det
18fc0 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
18fd0 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
18fe0 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a   zero byte to .*
18ff0 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
19000 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61   new file instea
19010 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
19020 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53  essful, return S
19030 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
19040 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
19050 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a  while modifying.
19060 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
19070 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65  file, return the
19080 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
19090 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
190a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
190b0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
190c0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
190d0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
190e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
190f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
19100 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
19110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19120 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
19130 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a  ER_READER );.  .
19140 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
19150 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20  ger->fd) .   && 
19160 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
19170 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
19180 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
19190 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
191a0 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  N) .  ){.    i64
191b0 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
191c0 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73  wSize;.    int s
191d0 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
191e0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  pageSize;.    as
191f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
19200 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
19210 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f  OCK );.    /* TO
19220 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74  DO: Is it safe t
19230 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69  o use Pager.dbFi
19240 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a  leSize here? */.
19250 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19260 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
19270 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
19280 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
19290 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29  e = szPage*(i64)
192a0 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
192b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
192c0 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
192d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
192e0 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
192f0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
19300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
19310 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
19320 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
19330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19340 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20     char *pTmp = 
19350 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
19360 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e;.        memse
19370 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67  t(pTmp, 0, szPag
19380 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
19390 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
193a0 7a 50 61 67 65 29 20 3c 20 20 63 75 72 72 65 6e  zPage) <  curren
193b0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
193c0 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
193d0 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63  ize-szPage) == c
193e0 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
193f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19400 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
19410 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   >  currentSize 
19420 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
19430 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
19440 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c  Pager->fd, pTmp,
19450 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65   szPage, newSize
19460 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20  -szPage);.      
19470 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
19480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19490 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
194a0 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
194b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
194c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
194d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
194e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
194f0 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
19500 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
19510 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
19520 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
19530 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
19540 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
19550 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
19560 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
19570 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
19580 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
19590 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
195a0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
195b0 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
195c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
195d0 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
195e0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
195f0 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
19600 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
19610 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
19620 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
19630 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
19640 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
19650 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
19660 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
19670 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
19680 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
19690 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
196a0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
196b0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
196c0 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
196d0 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
196e0 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
196f0 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
19700 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
19710 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
19720 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
19730 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
19740 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
19750 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
19760 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
19770 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
19780 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
19790 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
197a0 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
197b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
197c0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
197d0 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
197e0 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
197f0 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
19800 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
19810 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
19820 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
19830 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
19840 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
19850 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
19860 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
19870 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
19880 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
19890 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
198a0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
198b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
198c0 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
198d0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
198e0 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
198f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
19900 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
19910 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
19920 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
19930 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
19940 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
19950 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
19960 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
19970 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
19980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
19990 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
199a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
199b0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
199c0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
199d0 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
199e0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
199f0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
19a00 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
19a10 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
19a20 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
19a30 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
19a40 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
19a50 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
19a60 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19a70 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19a80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
19a90 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
19aa0 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
19ab0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
19ac0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
19ad0 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
19ae0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
19af0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
19b00 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
19b10 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
19b20 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
19b30 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
19b40 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
19b50 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
19b60 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
19b70 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
19b80 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
19b90 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19ba0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
19bb0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
19bc0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
19bd0 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
19be0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
19bf0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
19c00 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19c10 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
19c20 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
19c30 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
19c40 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
19c50 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
19c60 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
19c70 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
19c80 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
19c90 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
19ca0 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
19cb0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
19cc0 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
19cd0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
19ce0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
19cf0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
19d00 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
19d10 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
19d20 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
19d30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19d40 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
19d50 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
19d60 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
19d70 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
19d80 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
19d90 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
19da0 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
19db0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
19dc0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
19dd0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
19de0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
19df0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
19e00 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
19e10 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
19e20 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
19e30 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
19e40 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
19e50 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
19e60 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
19e70 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
19e80 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
19e90 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
19ea0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
19eb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
19ec0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
19ed0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
19ee0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
19ef0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
19f00 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
19f10 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
19f20 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
19f30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19f40 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
19f50 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
19f60 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
19f70 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
19f80 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
19f90 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
19fa0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
19fb0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
19fc0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
19fd0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
19fe0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
19ff0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1a000 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1a010 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1a020 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1a030 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1a040 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1a050 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1a060 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1a070 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1a080 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1a090 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1a0a0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1a0b0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1a0c0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1a0d0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1a0e0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1a0f0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1a100 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1a110 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1a120 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1a130 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1a140 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1a150 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1a160 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1a170 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1a180 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1a190 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1a1a0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1a1b0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1a1c0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1a1d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1a1e0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1a1f0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1a200 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1a210 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1a220 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1a230 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1a240 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1a250 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a260 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1a270 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1a280 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1a290 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1a2a0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1a2b0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1a2c0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1a2d0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1a2e0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1a2f0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1a300 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1a310 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1a320 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1a330 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1a340 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1a350 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1a360 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1a370 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1a380 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1a390 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1a3a0 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1a3b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1a3c0 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1a3d0 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1a3e0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1a3f0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1a400 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1a410 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1a420 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1a430 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1a440 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1a450 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1a460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1a470 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1a480 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1a490 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1a4a0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1a4b0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1a4c0 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1a4d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1a4e0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1a4f0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1a520 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1a530 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1a540 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1a550 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a560 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1a570 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1a580 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1a590 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1a5a0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1a5b0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1a5c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1a5d0 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1a5e0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1a5f0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a610 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1a620 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1a630 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a650 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1a660 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1a670 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1a680 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1a690 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1a6a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a6b0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1a6c0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1a6d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1a6e0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1a6f0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1a700 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
1a710 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1a720 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1a730 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1a740 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1a750 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1a760 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1a770 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1a780 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1a790 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a7a0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1a7b0 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1a7c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a7d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1a7e0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1a7f0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1a800 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a810 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1a820 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1a830 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1a840 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1a850 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1a860 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1a870 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1a880 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1a890 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1a8a0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1a8b0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1a8c0 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1a8d0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1a8e0 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1a8f0 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1a900 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1a910 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1a920 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1a930 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1a940 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1a950 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1a960 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1a970 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1a980 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1a990 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1a9a0 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1a9b0 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1a9c0 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1a9d0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1a9e0 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1a9f0 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1aa00 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1aa10 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1aa20 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1aa30 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1aa40 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1aa50 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1aa60 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1aa70 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1aa80 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1aa90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1aaa0 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1aab0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1aac0 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1aad0 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1aae0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1aaf0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1ab00 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1ab10 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1ab20 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1ab30 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1ab40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ab50 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1ab60 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1ab70 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1ab80 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1ab90 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1aba0 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1abb0 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1abc0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1abd0 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1abe0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1abf0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1ac00 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1ac10 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1ac20 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1ac30 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1ac40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ac50 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1ac60 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1ac70 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1ac80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ac90 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1aca0 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1acb0 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1acc0 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1acd0 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1ace0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1acf0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1ad00 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1ad10 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1ad20 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1ad30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1ad40 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1ad50 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1ad60 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1ad70 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1ad80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1ad90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ada0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1adb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1adc0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1add0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ade0 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1adf0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1ae00 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1ae10 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1ae20 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1ae30 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1ae40 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1ae50 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1ae60 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1ae70 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1ae80 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1ae90 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1aea0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1aeb0 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1aec0 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1aed0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1aee0 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1aef0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1af00 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1af10 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1af20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1af30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1af40 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1af50 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1af60 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1af70 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1af80 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1af90 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1afa0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1afb0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1afc0 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1afd0 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1afe0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1aff0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1b000 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1b010 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1b020 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1b030 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1b040 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1b050 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1b060 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1b070 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1b080 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1b090 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1b0a0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1b0b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1b0c0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1b0d0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1b0e0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1b0f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1b100 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1b110 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1b120 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1b130 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1b140 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1b150 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1b160 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1b170 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1b180 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1b190 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1b1a0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1b1b0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1b1c0 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1b1d0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1b1e0 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1b1f0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1b200 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1b210 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1b220 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1b230 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1b240 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1b250 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1b260 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1b270 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b280 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1b290 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1b2a0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1b2b0 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1b2c0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1b2d0 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1b2e0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1b2f0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1b300 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b310 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1b320 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1b330 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1b340 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1b350 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1b360 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b370 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1b380 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1b390 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1b3a0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1b3b0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1b3c0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b3d0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1b3e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1b3f0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1b400 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1b410 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1b420 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1b430 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1b440 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1b450 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1b460 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1b470 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b490 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b4a0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1b4b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1b4c0 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1b4d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1b4e0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1b4f0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1b500 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1b510 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1b520 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1b530 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1b540 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1b550 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1b560 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1b570 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1b580 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1b590 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b5a0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1b5b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1b5c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1b5d0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1b5e0 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1b5f0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1b600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b620 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b630 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1b640 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1b650 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1b660 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1b670 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b680 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1b690 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1b6a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1b6b0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1b6c0 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1b6d0 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1b6e0 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1b6f0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1b700 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1b710 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1b720 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1b730 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1b740 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1b750 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1b760 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1b770 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1b780 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1b790 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1b7a0 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1b7b0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1b7c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1b7d0 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1b7e0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1b7f0 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1b800 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1b810 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1b820 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1b830 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b840 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1b850 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1b860 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1b870 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1b880 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1b890 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1b8a0 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1b8b0 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1b8c0 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1b8d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1b8e0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1b8f0 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1b900 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1b910 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1b920 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1b930 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1b940 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1b950 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1b960 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1b970 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b980 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1b990 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1b9a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b9b0 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1b9c0 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1b9d0 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1b9e0 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
1b9f0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
1ba00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ba10 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
1ba20 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
1ba30 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
1ba40 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1ba50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
1ba60 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
1ba70 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
1ba80 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
1ba90 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
1baa0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
1bab0 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
1bac0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1bad0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
1bae0 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
1baf0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50    assert(.    pP
1bb00 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1bb10 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c  ds==0 ||.    sql
1bb20 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1bb30 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  l(pPager->fd,SQL
1bb40 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1bb50 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54  HANGED,0)>=SQLIT
1bb60 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  E_OK.  );..  /* 
1bb70 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1bb80 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1bb90 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1bba0 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1bbb0 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1bbc0 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1bbd0 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1bbe0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1bbf0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1bc00 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1bc10 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1bc20 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1bc30 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1bc40 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1bc50 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1bc60 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1bc70 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1bc80 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1bc90 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1bca0 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1bcb0 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1bcc0 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1bcd0 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1bce0 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1bcf0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1bd00 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1bd10 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1bd20 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1bd30 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1bd40 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1bd50 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1bd60 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1bd70 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1bd80 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1bd90 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1bda0 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1bdb0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1bdc0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1bdd0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1bde0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1bdf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1be00 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1be10 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1be20 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1be30 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1be40 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1be50 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1be60 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1be70 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1be80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1be90 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1bea0 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1beb0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1bec0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1bed0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1bee0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1bef0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1bf00 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1bf10 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1bf20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bf30 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1bf40 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1bf50 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1bf60 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20  [0]!='\0');.    
1bf70 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1bf80 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1bf90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bfa0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1bfb0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
1bfc0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1bfd0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1bfe0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
1bff0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
1c000 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
1c010 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
1c020 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
1c030 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1c040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1c050 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
1c060 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1c070 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c090 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1c0a0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1c0b0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1c0c0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1c0d0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1c0e0 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1c0f0 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1c100 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1c110 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1c120 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1c130 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1c140 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1c150 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1c160 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1c170 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1c180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c190 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1c1a0 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1c1b0 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1c1c0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1c1d0 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44  into .** pPg->pD
1c1e0 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f  ata. A shared lo
1c1f0 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
1c200 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  st be held on th
1c210 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1c220 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
1c230 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1c240 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  d..**.** If page
1c250 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e   1 is read, then
1c260 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
1c270 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1c280 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68   is set to.** th
1c290 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
1c2a0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1c2b0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ile..**.** If an
1c2c0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1c2d0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1c2e0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1c2f0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1c300 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  * Otherwise, SQL
1c310 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c320 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1c330 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48  t readDbPage(PgH
1c340 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
1c350 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c360 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65  >pPager; /* Page
1c370 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  r object associa
1c380 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50  ted with page pP
1c390 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
1c3a0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20   = pPg->pgno;   
1c3b0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1c3c0 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  er to read */.  
1c3d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c3e0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
1c3f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1c400 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20 30   int isInWal = 0
1c410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c420 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69 73   True if page is
1c430 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a   in log file */.
1c440 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1c450 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1c460 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1c470 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1c480 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c490 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1c4a0 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1c4b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1c4c0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1c4d0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21  ;..  if( NEVER(!
1c4e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1c4f0 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  d)) ){.    asser
1c500 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
1c510 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ile );.    memse
1c520 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
1c530 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c540 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
1c550 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1c560 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
1c570 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1c580 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1c590 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1c5a0 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1c5b0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1c5c0 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61  lite3WalRead(pPa
1c5d0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
1c5e0 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c   &isInWal, pgsz,
1c5f0 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1c600 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1c610 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61  TE_OK && !isInWa
1c620 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  l ){.    i64 iOf
1c630 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
1c640 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1c650 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
1c660 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1c670 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
1c680 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66  Data, pgsz, iOff
1c690 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
1c6a0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1c6b0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c6c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c6d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1c6e0 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1c6f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1c700 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1c710 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1c720 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1c730 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1c740 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1c750 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1c760 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1c770 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1c780 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1c790 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1c7a0 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1c7b0 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1c7c0 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1c7d0 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1c7e0 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1c7f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1c800 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1c810 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1c820 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1c830 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1c840 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1c850 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1c860 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1c870 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1c880 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1c890 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1c8a0 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1c8b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1c8c0 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1c8d0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1c8e0 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1c8f0 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1c900 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1c910 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c920 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1c930 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1c940 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1c950 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20  * white noising 
1c960 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1c970 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1c980 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1c990 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1c9a0 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1c9b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c9c0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1c9d0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1c9e0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1c9f0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1ca00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ca10 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1ca20 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1ca30 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1ca40 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1ca50 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1ca60 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1ca70 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1ca80 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1ca90 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1caa0 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
1cab0 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
1cac0 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52  NOMEM);..  PAGER
1cad0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1cae0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1caf0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1cb00 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1cb10 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1cb20 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1cb30 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1cb40 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1cb50 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1cb60 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1cb70 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1cb80 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1cb90 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1cba0 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1cbb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1cbc0 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1cbd0 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1cbe0 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1cbf0 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1cc00 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1cc10 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1cc20 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1cc30 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1cc40 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1cc50 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1cc60 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1cc70 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1cc80 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1cc90 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1cca0 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1ccb0 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1ccc0 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1ccd0 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1cce0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1ccf0 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1cd00 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1cd10 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1cd20 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1cd30 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1cd40 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1cd50 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1cd60 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1cd70 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1cd80 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1cd90 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1cda0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1cdb0 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1cdc0 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1cdd0 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1cde0 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1cdf0 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1ce00 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1ce10 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1ce20 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1ce30 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1ce40 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1ce50 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1ce60 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1ce70 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1ce80 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1ce90 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1cea0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1ceb0 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1cec0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1ced0 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1cee0 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1cef0 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1cf00 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1cf10 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1cf20 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1cf30 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1cf40 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1cf50 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1cf60 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1cf70 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1cf80 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1cf90 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1cfa0 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1cfb0 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1cfc0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1cfd0 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1cfe0 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1cff0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1d000 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1d010 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1d020 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1d030 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1d040 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1d050 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1d060 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1d070 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1d080 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1d090 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1d0a0 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1d0b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1d0c0 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1d0d0 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1d0e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1d0f0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1d100 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1d110 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1d120 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1d130 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1d140 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1d150 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1d160 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1d170 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1d180 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1d190 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1d1a0 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1d1b0 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1d1c0 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1d1d0 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1d1e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d1f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1d200 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1d210 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1d220 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
1d230 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
1d240 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
1d250 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
1d260 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1d270 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
1d280 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d290 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
1d2a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d2b0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
1d2c0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
1d2d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1d2f0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
1d300 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1d310 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1d320 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ref(pPg);.    }.
1d330 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1d340 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1d350 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1d360 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1d370 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1d380 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1d390 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1d3a0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1d3b0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1d3c0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1d3d0 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1d3e0 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1d3f0 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1d400 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1d410 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1d420 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1d430 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1d440 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1d450 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1d460 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1d470 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1d480 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1d490 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1d4a0 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1d4b0 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1d4c0 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1d4d0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1d4e0 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1d4f0 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1d500 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1d510 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1d520 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1d530 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1d540 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d560 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1d570 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1d580 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1d590 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1d5a0 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1d5b0 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1d5c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d5f0 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1d600 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1d610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1d620 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1d630 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1d640 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1d650 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1d660 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1d670 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1d680 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1d690 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1d6a0 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1d6b0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1d6c0 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1d6d0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1d6e0 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1d6f0 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1d700 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1d710 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1d720 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1d730 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1d740 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1d750 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1d760 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1d770 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1d780 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1d790 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1d7a0 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1d7b0 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1d7c0 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1d7d0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1d7e0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1d7f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1d800 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1d810 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1d820 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1d830 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1d840 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1d850 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1d860 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1d870 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1d880 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1d890 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1d8a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1d8b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1d8c0 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1d8d0 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1d8e0 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1d8f0 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1d900 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1d910 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1d920 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1d930 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1d940 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1d950 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1d960 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1d970 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1d980 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1d990 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1d9a0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1d9b0 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1d9c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1d9d0 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1d9e0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1d9f0 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1da00 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1da10 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1da20 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1da30 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1da40 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1da50 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1da60 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1da70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1da80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1da90 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dab0 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1dac0 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1dad0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1dae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1daf0 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1db00 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1db10 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c  .  int isCommit,
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1db40 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1db50 2f 0a 20 20 69 6e 74 20 73 79 6e 63 46 6c 61 67  /.  int syncFlag
1db60 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1db70 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
1db80 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29  pass to OsSync()
1db90 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20   (or 0) */.){.  
1dba0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1dbd0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1dbe0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1dbf0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48  efined(SQLITE_CH
1dc00 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48  ECK_PAGES).  PgH
1dc10 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc30 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1dc40 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66   pages */.#endif
1dc50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1dc60 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1dc70 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1dc80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1dc90 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1dca0 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1dcb0 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1dcc0 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1dcd0 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1dce0 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1dcf0 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1dd00 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1dd10 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1dd20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1dd30 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  f( isCommit ){. 
1dd40 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74     /* If a WAL t
1dd50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
1dd60 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  ing committed, t
1dd70 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1dd80 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20   in writing.    
1dd90 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74  ** any pages wit
1dda0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1ddb0 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75  reater than nTru
1ddc0 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57  ncate into the W
1ddd0 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  AL file..    ** 
1dde0 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  They will never 
1ddf0 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63  be read by any c
1de00 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65  lient. So remove
1de10 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70   them from the p
1de20 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73  Dirty.    ** lis
1de30 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50  t here. */.    P
1de40 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48  gHdr *p;.    PgH
1de50 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70  dr **ppNext = &p
1de60 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 70 3d  List;.    for(p=
1de70 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20  pList; (*ppNext 
1de80 3d 20 70 29 3b 20 70 3d 70 2d 3e 70 44 69 72 74  = p); p=p->pDirt
1de90 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  y){.      if( p-
1dea0 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65  >pgno<=nTruncate
1deb0 20 29 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e   ) ppNext = &p->
1dec0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
1ded0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1dee0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  );.  }..  if( pL
1def0 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
1df00 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1df10 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
1df20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1df30 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1df40 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1df50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1df60 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1df70 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63  , isCommit, sync
1df80 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28  Flags.  );.  if(
1df90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1dfa0 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  & pPager->pBacku
1dfb0 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  p ){.    PgHdr *
1dfc0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  p;.    for(p=pLi
1dfd0 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
1dfe0 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ty){.      sqlit
1dff0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
1e000 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
1e010 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70  p->pgno, (u8 *)p
1e020 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->pData);.    }.
1e030 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1e040 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1e050 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1e060 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1e070 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1e080 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
1e090 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1e0a0 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  {.    pager_set_
1e0b0 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d  pagehash(p);.  }
1e0c0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1e0d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
1e0e0 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e  egin a read tran
1e0f0 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57  saction on the W
1e100 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  AL..**.** This r
1e110 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62  outine used to b
1e120 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f  e called "pagerO
1e130 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62  penSnapshot()" b
1e140 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74  ecause it essent
1e150 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61  ially.** makes a
1e160 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65   snapshot of the
1e170 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
1e180 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69   current point i
1e190 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65  n time and prese
1e1a0 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61  rves.** that sna
1e1b0 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79  pshot for use by
1e1c0 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73   the reader in s
1e1d0 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65  pite of concurre
1e1e0 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a  ntly changes by.
1e1f0 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73  ** other writers
1e200 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72   or checkpointer
1e210 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1e220 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
1e230 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
1e240 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1e250 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e270 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1e280 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30   int changed = 0
1e290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e2a0 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
1e2b0 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20  e must be reset 
1e2c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  */..  assert( pa
1e2d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e2e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1e2f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1e300 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61  AGER_OPEN || pPa
1e310 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1e320 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20  ER_READER );..  
1e330 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  /* sqlite3WalEnd
1e340 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1e350 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
1e360 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
1e370 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  s.  ** transacti
1e380 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  on in locking_mo
1e390 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53  de=EXCLUSIVE.  S
1e3a0 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20  o call it now.  
1e3b0 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69  If we.  ** are i
1e3c0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e  n locking_mode=N
1e3d0 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61  ORMAL and EndRea
1e3e0 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73  d() was previous
1e3f0 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20  ly called,.  ** 
1e400 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61  the duplicate ca
1e410 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a  ll is harmless..
1e420 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61    */.  sqlite3Wa
1e430 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
1e440 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
1e450 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
1e460 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72  e3WalBeginReadTr
1e470 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1e480 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64  ->pWal, &changed
1e490 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1e4a0 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65  ITE_OK || change
1e4b0 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72  d ){.    pager_r
1e4c0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1e4d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1e4e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e4f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e500 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
1e510 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
1e520 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45  n from PAGER_OPE
1e530 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45  N.** to PAGER_RE
1e540 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65  ADER state to de
1e550 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1e560 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e570 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65   file.** in page
1e580 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
1e590 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e  page size curren
1e5a0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61  tly stored in Pa
1e5b0 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a  ger.pageSize)..*
1e5c0 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
1e5d0 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
1e5e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1e5f0 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
1e600 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
1e610 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65  n pages is store
1e620 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74  d in *pnPage. Ot
1e630 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
1e640 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a  r code (perhaps.
1e650 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
1e660 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e  FSTAT) is return
1e670 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ed and *pnPage i
1e680 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
1e690 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1e6a0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1e6b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1e6c0 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  gno *pnPage){.  
1e6d0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1e700 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
1e710 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68  /..  /* Query th
1e720 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1e730 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1e740 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44  e size. The WalD
1e750 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e  bsize().  ** fun
1e760 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65  ction returns ze
1e770 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  ro if the WAL is
1e780 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20   not open (i.e. 
1e790 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20  Pager.pWal==0), 
1e7a0 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64  or.  ** if the d
1e7b0 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1e7c0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  not available. T
1e7d0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1e7e0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61   is not.  ** ava
1e7f0 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1e800 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69  WAL sub-system i
1e810 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
1e820 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20  s empty or.  ** 
1e830 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69  contains no vali
1e840 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  d committed tran
1e850 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  sactions..  */. 
1e860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e870 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1e880 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1e890 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
1e8a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
1e8b0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
1e8c0 6b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73  k );.  nPage = s
1e8d0 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28  qlite3WalDbsize(
1e8e0 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
1e8f0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1e900 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e 6f  base size was no
1e910 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
1e920 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1e930 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d  tem,.  ** determ
1e940 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e 20  ine it based on 
1e950 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e960 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
1e970 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20  f the size.  ** 
1e980 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e990 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20 69  file is not an i
1e9a0 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
1e9b0 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
1e9c0 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77  ,.  ** round dow
1e9d0 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74  n to the nearest
1e9e0 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20 61   page. Except, a
1e9f0 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20 74  ny file larger t
1ea00 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65 73  han 0.  ** bytes
1ea10 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
1ea20 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61 69  idered to contai
1ea30 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  n at least one p
1ea40 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1ea50 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
1ea60 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea80 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65   Size of db file
1ea90 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
1eaa0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1eab0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1eac0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1ead0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
1eae0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
1eaf0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1eb00 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1eb10 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
1eb20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1eb30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1eb40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1eb50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1eb60 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
1eb70 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  )(n / pPager->pa
1eb80 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
1eb90 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 6e 3e 30   nPage==0 && n>0
1eba0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1ebb0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
1ebc0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1ebd0 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
1ebe0 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1ebf0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1ec00 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  the.  ** configu
1ec10 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
1ec20 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
1ec30 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
1ec40 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
1ec50 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
1ec60 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
1ec70 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
1ec80 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
1ec90 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
1eca0 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
1ecb0 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50  ..  *pnPage = nP
1ecc0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1ecd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
1ece0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ecf0 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  WAL./*.** Check 
1ed00 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
1ed10 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
1ed20 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
1ed30 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
1ed40 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
1ed50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1ed60 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
1ed70 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
1ed80 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
1ed90 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
1eda0 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
1edb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1edc0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
1edd0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1ede0 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
1edf0 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
1ee00 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
1ee10 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
1ee20 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
1ee30 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
1ee40 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
1ee50 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
1ee60 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
1ee70 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
1ee80 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
1ee90 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
1eea0 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
1eeb0 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
1eec0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1eed0 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
1eee0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
1eef0 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
1ef00 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
1ef10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ef20 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
1ef30 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
1ef40 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
1ef50 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
1ef60 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
1ef70 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
1ef80 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d  a WAL on a none-
1ef90 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
1efa0 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65  this ensures the
1efb0 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f  re is no race co
1efc0 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77  ndition .** betw
1efd0 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
1efe0 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78  ) below and an x
1eff0 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65  Delete() being e
1f000 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20  xecuted by some 
1f010 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  .** other connec
1f020 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1f030 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
1f040 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
1f050 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1f060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f080 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f090 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1f0a0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1f0b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
1f0c0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
1f0d0 63 6b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  ck );..  if( !pP
1f0e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1f0f0 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b  {.    int isWal;
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f110 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57      /* True if W
1f120 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  AL file exists *
1f130 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  /.    Pgno nPage
1f140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f150 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1f160 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f170 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   */..    rc = pa
1f180 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1f190 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1f1a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1f1b0 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50  n rc;.    if( nP
1f1c0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
1f1d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
1f1e0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
1f1f0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
1f200 20 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c   0);.      isWal
1f210 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1f220 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f230 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
1f240 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1f250 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
1f260 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
1f270 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a  _EXISTS, &isWal.
1f280 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1f290 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f2a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1f2b0 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20  ( isWal ){.     
1f2c0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c     testcase( sql
1f2d0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
1f2e0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
1f2f0 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  che)==0 );.     
1f300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f310 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67  agerOpenWal(pPag
1f320 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  er, 0);.      }e
1f330 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
1f340 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
1f350 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
1f360 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AL ){.        pP
1f370 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1f380 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
1f390 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20  LMODE_DELETE;.  
1f3a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1f3b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1f3c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  endif../*.** Pla
1f3d0 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20  yback savepoint 
1f3e0 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20  pSavepoint. Or, 
1f3f0 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
1f400 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
1f410 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
1f420 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1f430 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70  file. The case p
1f440 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20  Savepoint==NULL 
1f450 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20  occurs when .** 
1f460 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
1f470 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
1f480 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20   on a SAVEPOINT 
1f490 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61  that is a transa
1f4a0 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f  ction .** savepo
1f4b0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  int..**.** When 
1f4c0 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f  pSavepoint is no
1f4d0 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20  t NULL (meaning 
1f4e0 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  a non-transactio
1f4f0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  n savepoint is .
1f500 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ** being rolled 
1f510 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20  back), then the 
1f520 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  rollback consist
1f530 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65  s of up to three
1f540 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66   stages,.** perf
1f550 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ormed in the ord
1f560 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a  er specified:.**
1f570 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
1f580 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  e played back fr
1f590 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
1f5a0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20  nal starting at 
1f5b0 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73  byte.**     offs
1f5c0 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  et PagerSavepoin
1f5d0 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
1f5e0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20  ntinuing to .** 
1f5f0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
1f600 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f  nt.iHdrOffset, o
1f610 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
1f620 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1f630 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20  .**     file if 
1f640 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1f650 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72  HdrOffset is zer
1f660 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  o..**.**   * If 
1f670 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1f680 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74  HdrOffset is not
1f690 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65   zero, then page
1f6a0 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20  s are played.** 
1f6b0 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e      back startin
1f6c0 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
1f6d0 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  al header immedi
1f6e0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
1f6f0 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
1f700 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1f710 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
1f720 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1f730 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   file..**.**   *
1f740 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20   Pages are then 
1f750 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
1f760 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1f770 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a   file, starting.
1f780 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
1f790 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1f7a0 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69  SubRec and conti
1f7b0 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64  nuing to the end
1f7c0 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a   of.**     the j
1f7d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
1f7e0 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68  ** Throughout th
1f7f0 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e rollback proce
1f800 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20  ss, each time a 
1f810 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62  page is rolled b
1f820 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ack, the.** corr
1f830 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
1f840 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63   set in a bitvec
1f850 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69   structure (vari
1f860 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68  able pDone in th
1f870 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1f880 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73  ion below). This
1f890 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75   is used to ensu
1f8a0 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69  re that a page i
1f8b0 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64  s only.** rolled
1f8c0 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20   back the first 
1f8d0 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
1f8e0 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72  ntered in either
1f8f0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1f900 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  If pSavepoint is
1f910 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65   NULL, then page
1f920 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65  s are only playe
1f930 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
1f940 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
1f950 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e  file. There is n
1f960 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74  o need for a bit
1f970 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  vec in this case
1f980 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65  ..**.** In eithe
1f990 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70  r case, before p
1f9a0 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65  layback commence
1f9b0 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69  s the Pager.dbSi
1f9c0 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ze variable.** i
1f9d0 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76  s reset to the v
1f9e0 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c  alue that it hel
1f9f0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
1fa00 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
1fa10 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74  .** (or transact
1fa20 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69  ion). No page wi
1fa30 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72  th a page-number
1fa40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1fa50 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70  is value.** is p
1fa60 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f  layed back. If o
1fa70 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ne is encountere
1fa80 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73  d it is simply s
1fa90 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
1faa0 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
1fab0 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
1fac0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
1fad0 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
1fae0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
1faf0 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
1fb00 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65      /* Effective
1fb10 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
1fb20 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
1fb30 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
1fb40 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
1fb50 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
1fb60 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
1fb70 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  records */.  int
1fb80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fb90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1fba0 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  code */.  Bitvec
1fbb0 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20   *pDone = 0;    
1fbc0 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20     /* Bitvec to 
1fbd0 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61  ensure pages pla
1fbe0 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e  yed back only on
1fbf0 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
1fc00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
1fc10 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
1fc20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fc30 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1fc40 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
1fc50 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1fc60 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20  a bitvec to use 
1fc70 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
1fc80 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64   of pages rolled
1fc90 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   back */.  if( p
1fca0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
1fcb0 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33   pDone = sqlite3
1fcc0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61  BitvecCreate(pSa
1fcd0 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b  vepoint->nOrig);
1fce0 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20  .    if( !pDone 
1fcf0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1fd00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1fd10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
1fd20 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
1fd30 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
1fd40 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66  value it was bef
1fd50 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e  ore the savepoin
1fd60 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  t .  ** being re
1fd70 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65  verted was opene
1fd80 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  d..  */.  pPager
1fd90 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65  ->dbSize = pSave
1fda0 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69  point ? pSavepoi
1fdb0 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67  nt->nOrig : pPag
1fdc0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
1fdd0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1fde0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
1fdf0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
1fe00 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74   if( !pSavepoint
1fe10 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
1fe20 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
1fe30 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62  eturn pagerRollb
1fe40 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a  ackWal(pPager);.
1fe50 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50    }..  /* Use pP
1fe60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1fe70 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
1fe80 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
1fe90 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
1fea0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
1feb0 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
1fec0 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
1fed0 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
1fee0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
1fef0 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
1ff00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
1ff10 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
1ff20 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
1ff30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ff40 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
1ff50 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
1ff60 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
1ff70 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  alOff;.  assert(
1ff80 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1ff90 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d  ger)==0 || szJ==
1ffa0 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
1ffb0 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
1ffc0 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
1ffd0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
1ffe0 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
1fff0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20000 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
20010 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
20020 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
20030 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
20040 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
20050 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20060 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
20070 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
20080 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
20090 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
200a0 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
200b0 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
200c0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
200d0 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
200e0 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
200f0 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
20100 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
20110 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
20120 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
20130 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57  nt && !pagerUseW
20140 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
20150 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
20160 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
20170 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
20180 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
20190 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
201a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
201b0 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
201c0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
201d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
201e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
201f0 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
20200 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20210 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
20220 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
20230 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
20240 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
20250 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
20260 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
20270 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
20280 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
20290 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  0;.  }..  /* Con
202a0 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61  tinue rolling ba
202b0 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f  ck records out o
202c0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
202d0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
202e0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f   ** the first jo
202f0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65  urnal header see
20300 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  n and continuing
20310 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63   until the effec
20320 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  tive end.  ** of
20330 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20340 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75  l file.  Continu
20350 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66  e to skip out-of
20360 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64  -range pages and
20370 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  .  ** continue a
20380 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c  dding pages roll
20390 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65  ed back to pDone
203a0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
203b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
203c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
203d0 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
203e0 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
203f0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20400 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52  r */.    u32 nJR
20410 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  ec = 0;     /* N
20420 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
20430 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
20440 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
20450 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
20460 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a  dr(pPager, 0, sz
20470 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
20480 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
20490 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
204a0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
204b0 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a  * The "pPager->j
204c0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
204d0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
204e0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
204f0 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73  lOff".    ** tes
20500 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20  t is related to 
20510 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53  ticket #2565.  S
20520 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  ee the discussio
20530 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  n in the.    ** 
20540 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
20550 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
20560 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
20570 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
20580 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20   if( nJRec==0 . 
20590 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
205a0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
205b0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
205c0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
205d0 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  lOff.    ){.    
205e0 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28    nJRec = (u32)(
205f0 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
20600 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e  ournalOff)/JOURN
20610 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
20620 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
20630 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
20640 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63  E_OK && ii<nJRec
20650 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
20660 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b  nalOff<szJ; ii++
20670 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
20680 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
20690 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
206a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
206b0 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
206c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
206d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
206e0 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  NE );.  }.  asse
206f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
20700 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
20710 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a  rnalOff>=szJ );.
20720 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20  .  /* Finally,  
20730 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66  rollback pages f
20740 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
20750 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20  nal.  Page that 
20760 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f  were.  ** previo
20770 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  usly rolled back
20780 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
20790 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72   journal (and ar
207a0 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65  e hence in pDone
207b0 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  ).  ** will be s
207c0 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d  kipped.  Out-of-
207d0 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20  range pages are 
207e0 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20  also skipped..  
207f0 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
20800 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69  int ){.    u32 i
20810 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
20820 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
20830 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
20840 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  = pSavepoint->iS
20850 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
20860 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
20870 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
20880 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
20890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
208a0 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70  lSavepointUndo(p
208b0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61  Pager->pWal, pSa
208c0 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74  vepoint->aWalDat
208d0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  a);.    }.    fo
208e0 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d  r(ii=pSavepoint-
208f0 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51  >iSubRec; rc==SQ
20900 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50  LITE_OK && ii<pP
20910 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69  ager->nSubRec; i
20920 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
20930 72 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28  rt( offset==ii*(
20940 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
20950 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
20960 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
20970 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
20980 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65  , &offset, pDone
20990 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 1);.    }. 
209a0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
209b0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
209c0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  }..  sqlite3Bitv
209d0 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29  ecDestroy(pDone)
209e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
209f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
20a00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20a10 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65  = szJ;.  }..  re
20a20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20a30 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
20a40 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
20a50 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
20a60 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
20a70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20a80 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
20a90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
20aa0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
20ab0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
20ac0 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
20ad0 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
20ae0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  e);.}../*.** Fre
20af0 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
20b00 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
20b10 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  m the pager..*/.
20b20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
20b30 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70  rShrink(Pager *p
20b40 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
20b50 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50  3PcacheShrink(pP
20b60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
20b70 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
20b80 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
20b90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
20ba0 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
20bb0 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
20bc0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
20bd0 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
20be0 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
20bf0 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
20c00 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
20c10 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
20c20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
20c30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
20c40 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
20c50 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
20c60 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
20c70 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
20c80 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
20c90 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
20ca0 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
20cb0 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
20cc0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
20cd0 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
20ce0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
20cf0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
20d00 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
20d10 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
20d20 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
20d30 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
20d40 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
20d50 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
20d60 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
20d70 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
20d80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20d90 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
20da0 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
20db0 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
20dc0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
20dd0 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
20de0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
20df0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
20e00 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
20e10 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
20e20 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
20e30 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
20e40 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
20e50 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
20e60 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
20e70 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
20e80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
20e90 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
20ea0 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
20eb0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
20ec0 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
20ed0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
20ee0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
20ef0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
20f00 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
20f10 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
20f20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
20f30 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
20f40 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
20f50 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
20f60 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
20f70 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
20f80 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
20f90 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
20fa0 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
20fb0 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
20fc0 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
20fd0 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
20fe0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
20ff0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
21000 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
21010 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
21020 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
21030 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63  is for a rollbac
21040 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20  k-journal mode. 
21050 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f   For WAL mode, O
21060 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20  FF continues.** 
21070 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20  to mean that no 
21080 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72  syncs ever occur
21090 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  .  NORMAL means 
210a0 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20  that the WAL is 
210b0 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20  synced.** prior 
210c0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
210d0 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74  checkpoint and t
210e0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
210f0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a   file is synced.
21100 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
21110 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63  sion of the chec
21120 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e  kpoint if the en
21130 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
21140 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77  the WAL.** was w
21150 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
21160 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
21170 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72  But no sync oper
21180 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72  ations occur for
21190 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
211a0 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c  commit in NORMAL
211b0 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20   mode with WAL. 
211c0 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   FULL means that
211d0 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65   the WAL.** file
211e0 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   is synced follo
211f0 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74  wing each commit
21200 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61   operation, in a
21210 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a  ddition to the.*
21220 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74  * syncs associat
21230 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a  ed with NORMAL..
21240 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e  **.** Do not con
21250 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  fuse synchronous
21260 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54  =FULL with SQLIT
21270 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68  E_SYNC_FULL.  Th
21280 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43  e.** SQLITE_SYNC
21290 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e  _FULL macro mean
212a0 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63  s to use the Mac
212b0 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66  OSX-style full-f
212c0 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63  sync.** using fc
212d0 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29  ntl(F_FULLFSYNC)
212e0 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  .  SQLITE_SYNC_N
212f0 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64  ORMAL means to d
21300 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  o an.** ordinary
21310 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20   fsync() call.  
21320 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
21330 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53  erence between S
21340 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
21350 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59  ** and SQLITE_SY
21360 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61  NC_NORMAL on pla
21370 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61  tforms other tha
21380 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74  n MacOSX.  But t
21390 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75  he.** synchronou
213a0 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79  s=FULL versus sy
213b0 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
213c0 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69   setting determi
213d0 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  nes when.** the 
213e0 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20  xSync primitive 
213f0 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73  is called and is
21400 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c   relevant to all
21410 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a   platforms..**.*
21420 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
21430 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21440 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
21450 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
21460 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
21470 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
21480 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
21490 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
214a0 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
214b0 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65 72  tyLevel(.  Pager
214c0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
214d0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
214e0 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65   set safety leve
214f0 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6c  l for */.  int l
21500 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
21510 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
21520 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
21530 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
21540 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75 6c   */  .  int bFul
21550 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f 2a  lFsync,       /*
21560 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e   PRAGMA fullfsyn
21570 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70 74  c */.  int bCkpt
21580 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a 20  FullFsync    /* 
21590 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e  PRAGMA checkpoin
215a0 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29  t_fullfsync */.)
215b0 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76 65  {.  assert( leve
215c0 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33  l>=1 && level<=3
215d0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
215e0 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d  Sync =  (level==
215f0 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
21600 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
21610 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
21620 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21  = (level==3 && !
21630 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
21640 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50  ) ?1:0;.  if( pP
21650 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
21660 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
21670 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  Flags = 0;.    p
21680 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
21690 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lags = 0;.  }els
216a0 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e 63  e if( bFullFsync
216b0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
216c0 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
216d0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
216e0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
216f0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
21700 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
21710 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75 6c  lse if( bCkptFul
21720 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  lFsync ){.    pP
21730 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
21740 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
21750 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
21760 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
21770 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
21780 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
21790 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
217a0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
217b0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
217c0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
217d0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
217e0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 7d 0a 23  _NORMAL;.  }.}.#
217f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
21800 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
21810 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
21820 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
21830 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
21840 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
21850 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
21860 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
21870 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
21880 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
21890 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
218a0 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
218b0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
218c0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
218d0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
218e0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
218f0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
21900 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
21910 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
21920 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
21930 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
21940 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
21950 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
21960 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
21970 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
21980 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
21990 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
219a0 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
219b0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
219c0 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
219d0 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
219e0 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
219f0 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
21a00 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
21a10 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
21a20 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
21a30 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
21a40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
21a50 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
21a60 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
21a70 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
21a80 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
21a90 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
21aa0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
21ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
21ac0 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
21ad0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
21ae0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
21af0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
21b00 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
21b10 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
21b20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
21b30 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
21b40 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
21b50 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
21b60 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
21b70 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
21b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21b90 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21ba0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
21bb0 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
21bc0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
21bd0 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
21be0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
21bf0 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
21c00 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
21c10 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
21c20 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
21c30 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
21c40 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
21c50 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
21c60 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
21c70 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
21c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
21c90 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
21ca0 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
21cb0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
21cc0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
21cd0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
21ce0 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
21cf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
21d00 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
21d10 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
21d20 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
21d30 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
21d40 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
21d50 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
21d60 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
21d70 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
21d80 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
21d90 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
21da0 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
21db0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
21dc0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
21dd0 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
21de0 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
21df0 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
21e00 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
21e10 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
21e20 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
21e30 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
21e40 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
21e50 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
21e60 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
21e70 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
21e80 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
21e90 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
21ea0 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
21eb0 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
21ed0 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
21ee0 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
21ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f20 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
21f30 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
21f40 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
21f50 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
21f60 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
21f70 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
21f80 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
21f90 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
21fa0 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
21fb0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
21fc0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
21fd0 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
21fe0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
21ff0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
22000 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
22010 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
22020 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
22030 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
22040 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
22050 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
22060 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
22070 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
22080 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
22090 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
220a0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
220b0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220d0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
220e0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
220f0 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
22100 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
22110 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
22120 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
22130 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
22140 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22160 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
22170 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
22180 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67  r */.){  .  pPag
22190 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
221a0 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
221b0 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
221c0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
221d0 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a  syHandlerArg;.}.
221e0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
221f0 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64  e page size used
22200 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62   by the Pager ob
22210 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61  ject. The new pa
22220 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70  ge size .** is p
22230 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53  assed in *pPageS
22240 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
22250 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
22260 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  e error state wh
22270 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
22280 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a   is called, it.*
22290 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68  * is a no-op. Th
222a0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
222b0 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74   is the error st
222c0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28  ate error code (
222d0 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20  i.e. .** one of 
222e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e  SQLITE_IOERR, an
222f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78   SQLITE_IOERR_xx
22300 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51  x sub-code or SQ
22310 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
22320 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
22330 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
22340 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
22350 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
22360 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
22370 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
22380 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
22390 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
223a0 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
223b0 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
223c0 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
223d0 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
223e0 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
223f0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
22400 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
22410 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
22420 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
22430 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
22440 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
22450 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
22460 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
22470 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
22480 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
22490 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
224a0 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
224b0 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
224c0 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
224d0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
224e0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
224f0 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
22500 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
22510 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
22520 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
22530 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
22540 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
22550 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
22560 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
22570 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
22580 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
22590 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
225a0 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
225b0 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
225c0 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
225d0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
225e0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
225f0 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
22600 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
22610 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
22620 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
22630 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
22640 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
22650 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
22660 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
22670 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
22680 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
22690 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
226a0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
226b0 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
226c0 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
226d0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
226e0 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
226f0 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
22700 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
22710 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
22720 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
22730 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70   *pPager, u32 *p
22740 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  PageSize, int nR
22750 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
22760 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22770 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
22780 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20  ossible to do a 
22790 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65  full assert_page
227a0 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20  r_state() here, 
227b0 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  as this.  ** fun
227c0 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
227d0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
227e0 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66  PagerOpen(), bef
227f0 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20  ore the state.  
22800 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  ** of the Pager 
22810 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e  object is intern
22820 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e  ally consistent.
22830 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e  .  **.  ** At on
22840 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e  e point this fun
22850 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61  ction returned a
22860 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70  n error if the p
22870 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  ager was in .  *
22880 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  * PAGER_ERROR st
22890 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50  ate. But since P
228a0 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
228b0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
228c0 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
228d0 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
228e0 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
228f0 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e  erence, this fun
22900 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20  ction.  ** is a 
22910 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63  no-op for that c
22920 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ase anyhow..  */
22930 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65  ..  u32 pageSize
22940 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
22950 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
22960 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
22970 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
22980 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
22990 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69  AGE_SIZE) );.  i
229a0 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( (pPager->memD
229b0 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  b==0 || pPager->
229c0 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26  dbSize==0).   &&
229d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
229e0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
229f0 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26  PCache)==0 .   &
22a00 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  & pageSize && pa
22a10 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61  geSize!=(u32)pPa
22a20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
22a30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e   ){.    char *pN
22a40 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ew = NULL;      
22a50 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65         /* New te
22a60 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  mp space */.    
22a70 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a  i64 nByte = 0;..
22a80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
22a90 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45  eState>PAGER_OPE
22aa0 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  N && isOpen(pPag
22ab0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
22ac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
22ad0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
22ae0 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  fd, &nByte);.   
22af0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
22b00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22b10 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a    pNew = (char *
22b20 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c  )sqlite3PageMall
22b30 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  oc(pageSize);.  
22b40 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20      if( !pNew ) 
22b50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
22b60 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  M;.    }..    if
22b70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22b80 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
22b90 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
22ba0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
22bb0 7a 65 20 3d 20 28 50 67 6e 6f 29 28 6e 42 79 74  ze = (Pgno)(nByt
22bc0 65 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  e/pageSize);.   
22bd0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
22be0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
22bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
22c00 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
22c10 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
22c20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
22c30 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
22c40 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
22c50 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
22c60 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
22c70 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ze);.    }.  }..
22c80 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
22c90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
22ca0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22cb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
22cc0 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
22cd0 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
22ce0 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
22cf0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
22d00 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
22d10 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
22d20 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
22d30 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
22d40 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
22d50 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
22d60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22d70 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
22d80 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
22d90 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
22da0 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
22db0 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
22dc0 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
22dd0 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
22de0 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
22df0 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
22e00 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
22e10 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
22e20 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
22e30 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
22e40 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
22e50 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
22e60 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
22e70 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
22e80 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
22e90 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
22ea0 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
22eb0 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
22ec0 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
22ed0 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
22ee0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
22ef0 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
22f00 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
22f10 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
22f20 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
22f30 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
22f40 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
22f50 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
22f60 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
22f70 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
22f80 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
22f90 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
22fa0 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
22fb0 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
22fc0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
22fd0 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
22fe0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
22ff0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
23000 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
23010 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
23020 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
23030 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
23040 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
23050 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
23060 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
23070 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
23080 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
23090 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
230a0 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61   mxPage;.  }.  a
230b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
230c0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
230d0 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c  N );      /* Cal
230e0 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d  led only by OP_M
230f0 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73  axPgcnt */.  ass
23100 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50  ert( pPager->mxP
23110 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno>=pPager->dbS
23120 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61  ize );  /* OP_Ma
23130 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20  xPgcnt enforces 
23140 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e  this */.  return
23150 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
23160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
23170 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
23180 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
23190 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
231a0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
231b0 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
231c0 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
231d0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
231e0 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
231f0 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
23200 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
23210 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
23220 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
23230 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
23240 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
23250 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
23260 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
23270 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
23280 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
23290 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
232a0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
232b0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
232c0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
232d0 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
232e0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
232f0 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
23300 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
23310 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
23320 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
23330 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
23340 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
23350 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
23360 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
23370 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
23380 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
23390 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
233a0 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
233b0 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
233c0 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
233d0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
233e0 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
233f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
23400 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
23410 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
23420 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
23430 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
23440 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
23450 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
23460 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
23470 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
23480 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
23490 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
234a0 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
234b0 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
234c0 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
234d0 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
234e0 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
234f0 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
23500 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
23510 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
23520 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
23530 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
23540 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
23550 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
23560 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
23570 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
23580 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
23590 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
235a0 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
235b0 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
235c0 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
235d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
235e0 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
235f0 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
23600 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
23610 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
23620 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
23630 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
23640 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
23650 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
23660 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
23670 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
23680 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
23690 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
236a0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
236b0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
236c0 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
236d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
236e0 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
236f0 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
23700 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23710 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
23720 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  mpFile );..  /* 
23730 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
23740 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62  only called by b
23750 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  tree immediately
23760 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a   after creating.
23770 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f    ** the Pager o
23780 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61  bject.  There ha
23790 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70  s not been an op
237a0 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61  portunity to tra
237b0 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  nsition.  ** to 
237c0 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20  WAL mode yet..  
237d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
237e0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
237f0 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  ) );..  if( isOp
23800 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
23810 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
23820 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
23830 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
23840 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23850 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
23860 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
23870 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23880 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
23890 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
238a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
238b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
238c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
238d0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
238e0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
238f0 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
23900 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a  tion is open on.
23910 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  ** the pager. It
23920 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
23930 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
23940 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
23950 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65  se..**.** Howeve
23960 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
23970 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
23980 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
23990 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
239a0 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
239b0 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
239c0 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
239d0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
239e0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
239f0 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
23a00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23a10 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
23a20 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
23a30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
23a40 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
23a50 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20  R_FINISHED );.  
23a60 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70  *pnPage = (int)p
23a70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d  Pager->dbSize;.}
23a80 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
23a90 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
23aa0 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
23ab0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
23ac0 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
23ad0 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
23ae0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
23af0 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
23b00 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
23b10 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
23b20 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
23b30 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
23b40 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
23b50 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
23b60 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
23b70 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
23b80 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
23b90 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
23ba0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
23bb0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
23bc0 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
23bd0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
23be0 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
23bf0 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
23c00 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
23c10 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
23c20 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
23c30 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
23c40 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
23c50 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
23c60 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
23c70 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
23c80 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
23c90 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
23ca0 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
23cb0 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
23cc0 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
23cd0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
23ce0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
23cf0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
23d00 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
23d10 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
23d20 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
23d50 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  de */..  /* Chec
23d60 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
23d70 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
23d80 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
23d90 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
23da0 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ** already held,
23db0 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
23dc0 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74  ransistions that
23dd0 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
23de0 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
23df0 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
23e00 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
23e10 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
23e20 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
23e30 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
23e40 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
23e50 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c  pPager->eLock>=l
23e60 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
23e70 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
23e80 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f  k==NO_LOCK && lo
23e90 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
23ea0 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  OCK).       || (
23eb0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52  pPager->eLock==R
23ec0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
23ed0 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
23ee0 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a  IVE_LOCK).  );..
23ef0 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
23f00 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
23f10 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  er, locktype);. 
23f20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
23f30 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
23f40 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
23f50 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
23f60 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72  ndlerArg) );.  r
23f70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23f80 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
23f90 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
23fa0 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
23fb0 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
23fc0 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
23fd0 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
23fe0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
23ff0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
24000 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
24010 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
24020 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
24030 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
24040 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
24050 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
24060 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
24070 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
24080 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
24090 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
240a0 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
240b0 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
240c0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
240d0 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
240e0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
240f0 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
24100 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
24110 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
24120 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
24130 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
24140 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
24150 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
24160 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
24170 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
24180 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
24190 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
241a0 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
241b0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
241c0 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
241d0 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
241e0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
241f0 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
24200 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
24210 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
24220 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24230 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
24240 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
24250 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
24260 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
24270 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
24280 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64   behaviour would
24290 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74   be to restore t
242a0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
242b0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
242c0 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  e. However, sinc
242d0 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69  e this content i
242e0 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
242f0 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64   either.** the d
24300 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
24310 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  the portion of t
24320 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
24330 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d  nal and .** sub-
24340 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62  journal rolled b
24350 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ack the content 
24360 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73  could not be res
24370 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  tored and the.**
24380 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
24390 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  would become cor
243a0 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72  rupt. It is ther
243b0 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20  efore fortunate 
243c0 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69  that .** this ci
243d0 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f  rcumstance canno
243e0 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20  t arise..*/.#if 
243f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
24400 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
24410 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
24420 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48  ConstraintCb(PgH
24430 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  dr *pPg){.  asse
24440 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
24450 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
24460 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71  assert( !subjReq
24470 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c  uiresPage(pPg) |
24480 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67  | pPg->pgno<=pPg
24490 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ->pPager->dbSize
244a0 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   );.}.static voi
244b0 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
244c0 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72  Constraint(Pager
244d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
244e0 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
244f0 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
24500 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72  PCache, assertTr
24510 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
24520 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Cb);.}.#else.# d
24530 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e  efine assertTrun
24540 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
24550 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f  Pager).#endif../
24560 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
24570 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
24580 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
24590 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
245a0 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
245b0 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
245c0 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
245d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
245e0 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
245f0 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
24600 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
24610 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
24620 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
24630 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
24640 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
24650 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
24660 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
24670 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24680 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
24690 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
246a0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
246b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
246c0 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29  >dbSize>=nPage )
246d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
246e0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
246f0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
24700 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  D );.  pPager->d
24710 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
24720 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
24730 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
24740 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
24750 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
24760 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  lled before atte
24770 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  mpting a hot-jou
24780 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
24790 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a  t.** syncs the j
247a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64  ournal file to d
247b0 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70  isk, then sets p
247c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
247d0 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65  r to the.** size
247e0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
247f0 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  file so that the
24800 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
24810 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a  ) routine knows.
24820 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69  ** that the enti
24830 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  re journal file 
24840 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
24850 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61  .**.** Syncing a
24860 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   hot-journal to 
24870 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65  disk before atte
24880 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
24890 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a  t back ensures .
248a0 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  ** that if a pow
248b0 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er-failure occur
248c0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
248d0 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65  lback, the proce
248e0 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d  ss that.** attem
248f0 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  pts rollback fol
24900 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65  lowing system re
24910 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20  covery sees the 
24920 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  same journal.** 
24930 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20  content as this 
24940 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  process..**.** I
24950 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
24960 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51  s as planned, SQ
24970 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
24980 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
24990 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
249a0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
249b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e  tic int pagerSyn
249c0 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  cHotJournal(Page
249d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
249e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
249f0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
24a00 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
24a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
24a20 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
24a30 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
24a40 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  L);.  }.  if( rc
24a50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24a60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24a70 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
24a80 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
24a90 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
24aa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24ab0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
24ac0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
24ad0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
24ae0 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
24af0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
24b00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
24b10 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
24b20 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
24b30 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
24b40 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
24b50 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
24b60 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
24b70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
24b80 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
24b90 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
24ba0 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
24bb0 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
24bc0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
24bd0 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
24be0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
24bf0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
24c00 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
24c10 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
24c20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
24c30 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
24c40 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
24c50 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
24c60 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
24c70 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
24c80 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
24c90 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
24ca0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
24cb0 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
24cc0 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
24cd0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
24ce0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
24cf0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
24d00 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
24d10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
24d20 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
24d30 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  r){.  u8 *pTmp =
24d40 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
24d50 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73  TmpSpace;..  ass
24d60 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
24d70 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
24d80 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  );.  disable_sim
24d90 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24da0 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
24db0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
24dc0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
24dd0 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20  rrCode = 0; */. 
24de0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
24df0 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e  veMode = 0;.#ifn
24e00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24e10 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  WAL.  sqlite3Wal
24e20 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57  Close(pPager->pW
24e30 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  al, pPager->ckpt
24e40 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65  SyncFlags, pPage
24e50 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d  r->pageSize, pTm
24e60 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57  p);.  pPager->pW
24e70 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  al = 0;.#endif. 
24e80 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
24e90 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  ger);.  if( MEMD
24ea0 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75  B ){.    pager_u
24eb0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
24ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
24ed0 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79  f it is open, sy
24ee0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
24ef0 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
24f00 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  ng UnlockAndRoll
24f10 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20  back..    ** If 
24f20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65  this is not done
24f30 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63  , then an unsync
24f40 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
24f50 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a  e open journal .
24f60 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20      ** file may 
24f70 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  be played back i
24f80 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
24f90 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69  . If a power fai
24fa0 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20  lure occurs .   
24fb0 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69   ** while this i
24fc0 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65  s happening, the
24fd0 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
24fe0 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
24ff0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
25000 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
25010 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
25020 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
25030 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67  l, shift the pag
25040 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  er.    ** into t
25050 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
25060 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f  This causes Unlo
25070 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f  ckAndRollback to
25080 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20   unlock the.    
25090 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ** database and 
250a0 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
250b0 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  l file without a
250c0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
250d0 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b  l it.    ** back
250e0 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e   or finalize it.
250f0 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61   The next databa
25100 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76  se user will hav
25110 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72  e to do hot-jour
25120 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  nal.    ** rollb
25130 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73  ack before acces
25140 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  sing the databas
25150 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
25160 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
25170 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
25180 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
25190 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e  pPager, pagerSyn
251a0 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
251b0 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
251c0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
251d0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
251e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
251f0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
25200 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
25210 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
25220 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
25230 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
25240 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
25250 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
25260 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
25270 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
25280 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
25290 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
252a0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
252b0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
252c0 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  pTmp);.  sqlite3
252d0 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67  PcacheClose(pPag
252e0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23  er->pPCache);..#
252f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
25300 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61  _CODEC.  if( pPa
25310 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
25320 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ) pPager->xCodec
25330 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f  Free(pPager->pCo
25340 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  dec);.#endif..  
25350 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
25360 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21  >aSavepoint && !
25370 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
25380 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
25390 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
253a0 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28  jfd) && !isOpen(
253b0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b  pPager->sjfd) );
253c0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
253d0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
253e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
253f0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
25400 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
25410 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
25420 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
25430 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
25440 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f  age pPg..*/.Pgno
25450 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
25460 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
25470 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
25480 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64  Pg->pgno;.}.#end
25490 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
254a0 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
254b0 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65  e count for page
254c0 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   pPg..*/.void sq
254d0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
254e0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71  Page *pPg){.  sq
254f0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70  lite3PcacheRef(p
25500 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  Pg);.}../*.** Sy
25510 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
25520 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
25530 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
25540 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
25550 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
25560 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
25570 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
25580 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
25590 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
255a0 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73  k and can be res
255b0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  tored in the eve
255c0 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  nt of a hot-jour
255d0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  nal rollback..**
255e0 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72  .** If the Pager
255f0 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20  .noSync flag is 
25600 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  set, then this f
25610 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
25620 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
25630 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65  , the actions re
25640 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e  quired depend on
25650 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
25660 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65  e and the .** de
25670 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
25680 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20  tics of the the 
25690 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
256a0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
256b0 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
256c0 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
256d0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
256e0 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
256f0 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
25700 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
25710 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
25720 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
25730 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
25740 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
25750 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
25760 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
25770 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
25780 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
25790 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
257a0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
257b0 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
257c0 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
257d0 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
257e0 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
257f0 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
25800 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
25810 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
25820 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
25830 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
25840 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
25850 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
25860 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
25870 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
25880 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
25890 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
258a0 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
258b0 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
258c0 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
258d0 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
258e0 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
258f0 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
25900 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
25910 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
25920 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
25930 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
25940 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
25950 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
25960 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
25970 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
25980 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
25990 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
259a0 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
259b0 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
259c0 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
259d0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
259e0 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  sful, this routi
259f0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47  ne clears the PG
25a00 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
25a10 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20  ag of every .** 
25a20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68  page currently h
25a30 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65  eld in memory be
25a40 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
25a50 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
25a60 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65  IO.** error is e
25a70 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
25a80 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
25a90 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
25aa0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
25ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
25ac0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
25ad0 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64  Pager, int newHd
25ae0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
25b10 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
25b20 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
25b30 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
25b40 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
25b50 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
25b60 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
25b70 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
25b80 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
25b90 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
25ba0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  );.  assert( !pa
25bb0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
25bc0 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ) );..  rc = sql
25bd0 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
25be0 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  veLock(pPager);.
25bf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25c00 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
25c10 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
25c20 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
25c30 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
25c40 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
25c50 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
25c60 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
25c70 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
25c80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
25c90 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
25ca0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20    const int iDc 
25cb0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
25cc0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25cd0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
25ce0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
25cf0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
25d00 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
25d10 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
25d20 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
25d30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
25d40 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
25d50 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
25d60 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
25d70 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
25d80 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
25d90 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
25da0 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
25db0 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
25dc0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
25dd0 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
25de0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25df0 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
25e00 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
25e10 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
25e20 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
25e30 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
25e40 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
25e50 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
25e60 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
25e70 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
25e80 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
25e90 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
25ea0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
25eb0 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
25ec0 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69  tion's transacti
25ed0 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68  on), and a crash
25ee0 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72   or power-failur
25ef0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63  e .        ** oc
25f00 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20  curs after nRec 
25f10 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62  is updated but b
25f20 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65  efore this conne
25f30 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20  ction writes .  
25f40 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e        ** anythin
25f50 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f  g else to the jo
25f60 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63  urnal file (or c
25f70 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63  ommits/rolls bac
25f80 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a  k its .        *
25f90 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  * transaction), 
25fa0 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20  then SQLite may 
25fb0 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20  become confused 
25fc0 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a  when doing the .
25fd0 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a          ** hot-j
25fe0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
25ff0 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  following recove
26000 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20  ry. It may roll 
26010 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20  back all.       
26020 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   ** of this conn
26030 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68  ections data, th
26040 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f  en proceed to ro
26050 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f  lling back the o
26060 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ld,.        ** o
26070 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20  ut-of-date data 
26080 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e  that follows it.
26090 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
260a0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
260b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77  .        ** To w
260c0 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
260d0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
260e0 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72  file does appear
260f0 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20   to contain.    
26100 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68      ** a valid h
26110 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  eader following 
26120 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
26130 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30  , then write a 0
26140 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  x00.        ** b
26150 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74  yte to the start
26160 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e   of it to preven
26170 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20  t it from being 
26180 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20  recognized..    
26190 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
261a0 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74  * Variable iNext
261b0 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
261c0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61   to the offset a
261d0 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20  t which this.   
261e0 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61       ** problema
261f0 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20  tic header will 
26200 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69  occur, if it exi
26210 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75  sts. aMagic is u
26220 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  sed .        ** 
26230 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  as a temporary b
26240 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74  uffer to inspect
26250 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c   the first coupl
26260 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20  e of bytes of.  
26270 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74        ** the pot
26280 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68  ential journal h
26290 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  eader..        *
262a0 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e  /.        i64 iN
262b0 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20  extHdrOffset;.  
262c0 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b        u8 aMagic[
262d0 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a  8];.        u8 z
262e0 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
262f0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b  ournalMagic)+4];
26300 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ..        memcpy
26310 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
26320 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
26330 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
26340 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
26350 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
26360 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
26370 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  )], pPager->nRec
26380 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78  );..        iNex
26390 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75  tHdrOffset = jou
263a0 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
263b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ager);.        r
263c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
263d0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
263e0 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48  Magic, 8, iNextH
263f0 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
26400 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26410 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  E_OK && 0==memcm
26420 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
26430 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20  alMagic, 8) ){. 
26440 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
26450 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74  const u8 zerobyt
26460 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
26470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
26480 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
26490 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20  , &zerobyte, 1, 
264a0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
264b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
264c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
264d0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
264e0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
264f0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
26500 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26510 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
26520 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
26530 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
26540 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
26550 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
26560 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
26570 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
26580 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
26590 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
265a0 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
265b0 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
265c0 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
265d0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
265e0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
265f0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
26600 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
26610 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
26620 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
26630 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
26640 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
26650 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
26660 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
26670 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
26680 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
26690 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
266a0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
266b0 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
266c0 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
266d0 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
266e0 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
266f0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
26700 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
26710 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
26720 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
26730 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
26740 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
26750 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
26760 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
26770 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
26780 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
26790 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
267a0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
267b0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
267c0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
267d0 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
267e0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
267f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
26800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
26810 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
26820 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
26830 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26840 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
26850 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
26860 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  yncFlags);.     
26870 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26880 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
26890 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
268a0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
268b0 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
268c0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
268d0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
268e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
268f0 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
26900 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
26910 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
26920 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
26930 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
26940 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
26950 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26960 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
26970 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
26980 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
26990 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
269a0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
269b0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
269c0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
269d0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
269e0 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
269f0 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
26a00 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
26a10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
26a20 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
26a30 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
26a40 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20  >syncFlags| .   
26a50 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
26a60 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54  syncFlags==SQLIT
26a70 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
26a80 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
26a90 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
26aa0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26ab0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
26ac0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
26ad0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
26ae0 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
26af0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
26b00 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26      if( newHdr &
26b10 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
26b20 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
26b30 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ND) ){.        p
26b40 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
26b50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
26b60 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
26b70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
26b80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26b90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
26ba0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
26bb0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
26bc0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
26bd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
26be0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
26bf0 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
26c00 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f   is in noSync mo
26c10 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
26c20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20  file was just . 
26c30 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   ** successfully
26c40 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20   synced. Either 
26c50 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50  way, clear the P
26c60 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
26c70 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c  lag on .  ** all
26c80 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73   pages..  */.  s
26c90 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
26ca0 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65  rSyncFlags(pPage
26cb0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70  r->pPCache);.  p
26cc0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
26cd0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
26ce0 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73  OD;.  assert( as
26cf0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
26d00 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
26d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26d20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
26d30 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
26d40 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
26d50 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
26d60 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
26d70 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
26d80 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
26d90 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
26da0 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
26db0 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
26dc0 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
26dd0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
26de0 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
26df0 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
26e00 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
26e10 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
26e20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
26e30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
26e40 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
26e50 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
26e60 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
26e70 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
26e80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
26e90 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
26ea0 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
26eb0 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
26ec0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
26ed0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
26ee0 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
26ef0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
26f00 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
26f10 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
26f20 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
26f30 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
26f40 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
26f50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26f60 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
26f70 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
26f80 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
26f90 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
26fa0 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
26fb0 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
26fc0 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
26fd0 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
26fe0 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
26ff0 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
27000 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
27010 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
27020 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
27030 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
27040 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
27050 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
27060 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
27070 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
27080 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
27090 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
270a0 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
270b0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
270c0 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
270d0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
270e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
270f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
27100 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
27110 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
27120 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
27130 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
27140 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
27150 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
27160 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
27170 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
27180 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
27190 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
271a0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
271b0 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
271c0 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
271d0 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
271e0 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
271f0 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
27200 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
27210 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
27220 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
27230 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
27240 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
27250 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
27260 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
27270 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
27280 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
27290 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
272a0 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
272b0 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
272c0 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
272d0 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
272e0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
272f0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
27300 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
27310 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70  agelist(Pager *p
27320 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c  Pager, PgHdr *pL
27330 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ist){.  int rc =
27340 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27360 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
27370 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
27380 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
27390 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70  d for rollback p
273a0 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f  agers in WRITER_
273b0 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a  DBMOD state. */.
273c0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
273d0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
273e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
273f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
27400 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
27410 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27420 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
27430 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
27440 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
27450 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61  s a temp-file ha
27460 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
27470 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
27480 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e  ow. It.  ** is n
27490 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
274a0 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74  rc to be other t
274b0 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
274c0 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
274d0 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70  * is taken, as p
274e0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
274f0 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
27500 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20  or temp-files.. 
27510 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
27520 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
27530 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27540 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
27550 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27560 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
27570 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
27580 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
27590 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
275a0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
275b0 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65   the first write
275c0 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61  , give the VFS a
275d0 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68   hint of what th
275e0 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  e final.  ** fil
275f0 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a  e size will be..
27600 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72    */.  assert( r
27610 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
27620 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
27630 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  d) );.  if( rc==
27640 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
27650 67 65 72 2d 3e 64 62 53 69 7a 65 3e 70 50 61 67  ger->dbSize>pPag
27660 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
27670 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
27680 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61  t64 szFile = pPa
27690 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20  ger->pageSize * 
276a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
276b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
276c0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
276d0 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
276e0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
276f0 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46  _SIZE_HINT, &szF
27700 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ile);.    pPager
27710 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
27720 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
27730 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
27740 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
27750 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
27760 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
27770 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
27780 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
27790 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
277a0 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
277b0 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
277c0 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
277d0 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
277e0 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
277f0 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
27800 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
27810 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
27820 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
27830 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
27840 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
27850 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
27860 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
27870 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
27880 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
27890 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
278a0 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
278b0 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
278c0 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
278d0 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
278e0 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
278f0 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
27900 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
27910 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
27920 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
27930 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
27940 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
27950 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
27960 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
27970 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
27980 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
27990 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
279a0 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
279d0 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
279e0 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   ..      assert(
279f0 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50   (pList->flags&P
27a00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
27a10 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
27a20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
27a30 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
27a40 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
27a50 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63  );..      /* Enc
27a60 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
27a70 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
27a80 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
27a90 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
27aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27ab0 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  MEM, pData);..  
27ac0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
27ad0 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
27ae0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
27af0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
27b00 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
27b10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
27b20 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
27b30 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
27b40 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
27b50 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
27b60 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
27b70 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
27b80 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
27b90 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
27ba0 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
27bb0 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
27bc0 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
27bd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
27be0 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
27bf0 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
27c00 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
27c10 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
27c20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
27c30 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
27c40 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
27c50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
27c60 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
27c70 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
27c80 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
27c90 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
27ca0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
27cb0 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pgno;.      }.. 
27cc0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
27cd0 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
27ce0 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
27cf0 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
27d00 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
27d10 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
27d20 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
27d30 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70  up, pgno, (u8*)p
27d40 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20  List->pData);.. 
27d50 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
27d60 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
27d70 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
27d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27d90 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
27da0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
27db0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
27dc0 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
27dd0 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
27de0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
27df0 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
27e00 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
27e10 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
27e20 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
27e30 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
27e40 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ite);.    }else{
27e50 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
27e60 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
27e70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
27e80 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
27e90 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
27ea0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
27eb0 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69  (pList);.    pLi
27ec0 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
27ed0 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
27ee0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
27ef0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
27f00 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
27f10 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69  is open. If it i
27f20 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
27f30 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
27f40 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27f50 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
27f60 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
27f70 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
27f80 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
27f90 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  An .** SQLITE_IO
27fa0 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
27fb0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
27fc0 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  f a call to sqli
27fd0 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20  te3OsOpen() .** 
27fe0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
27ff0 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
28000 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
28010 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
28020 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
28030 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
28040 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  sjfd) ){.    if(
28050 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28060 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
28070 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
28080 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
28090 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
280a0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
280b0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
280c0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
280d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
280e0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
280f0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
28100 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
28110 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
28120 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28130 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
28140 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
28150 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
28160 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
28170 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
28180 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
28190 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
281a0 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
281b0 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
281c0 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
281d0 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
281e0 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
281f0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
28200 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
28210 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
28220 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
28230 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
28240 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
28250 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
28260 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
28270 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
28280 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
28290 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
282a0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
282b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
282c0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
282d0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
282e0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
282f0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
28300 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
28310 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
28320 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
28330 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
28340 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
28350 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
28360 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
28370 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
28380 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28390 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
283a0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
283b0 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ager;.  if( pPag
283c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
283d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
283e0 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f  DE_OFF ){..    /
283f0 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
28400 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61  ournal, if it ha
28410 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
28420 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20  en opened */.   
28430 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28440 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
28450 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
28460 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
28470 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
28480 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73  ager) );.    ass
28490 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
284a0 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61  er->sjfd) || pPa
284b0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20  ger->nSubRec==0 
284c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
284d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
284e0 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  r) .         || 
284f0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
28500 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  g) .         || 
28510 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
28520 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
28530 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70    );.    rc = op
28540 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
28550 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
28560 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
28570 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63   was opened succ
28580 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73  essfully (or was
28590 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a   already open),.
285a0 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65      ** write the
285b0 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
285c0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
285d0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
285e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
285f0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
28600 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
28610 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
28620 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28  Pager->nSubRec*(
28630 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
28640 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ze);.      char 
28650 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20  *pData2;.  .    
28660 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
28670 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
28680 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
28690 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
286a0 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  2);.      PAGERT
286b0 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE(("STMT-JOUR
286c0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
286d0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
286e0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
286f0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
28700 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
28710 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  sjfd, offset, pP
28720 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
28730 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28740 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
28750 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
28760 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
28770 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
28780 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
28790 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
287a0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
287b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
287c0 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
287d0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
287e0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
287f0 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  nt>0 );.    rc =
28800 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
28810 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
28820 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
28830 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28840 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
28850 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
28860 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
28870 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
28880 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
28890 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
288a0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
288b0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
288c0 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63  to a Pager objec
288d0 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20  t.** (cast as a 
288e0 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65  void*). The page
288f0 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72  r is always 'pur
28900 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20  geable' (not an 
28910 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
28920 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f  abase). The seco
28930 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
28940 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
28950 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a  page that is .**
28960 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
28970 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73   but has no outs
28980 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
28990 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20  es. The page.** 
289a0 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69  is always associ
289b0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61  ated with the Pa
289c0 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
289d0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
289e0 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
289f0 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
28a00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
28a10 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e  o make pPg clean
28a20 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20   by writing its 
28a30 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20  contents.** out 
28a40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28a50 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  file, if possibl
28a60 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f  e. This may invo
28a70 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a  lve syncing the.
28a80 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
28a90 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
28aa0 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63  ssful, sqlite3Pc
28ab0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
28ac0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
28ad0 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c   page and.** SQL
28ae0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
28af0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
28b00 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
28b10 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ing to make the.
28b20 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74  ** page clean, t
28b30 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
28b40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
28b50 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74   the page cannot
28b60 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61   be.** made clea
28b70 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  n for some other
28b80 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20   reason, but no 
28b90 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
28ba0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  en SQLITE_OK.** 
28bb0 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  is returned by s
28bc0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
28bd0 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63  Clean() is not c
28be0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
28bf0 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
28c00 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
28c10 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
28c20 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
28c30 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
28c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
28c50 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
28c60 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
28c70 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
28c80 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
28c90 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74  ..  /* The doNot
28ca0 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 69  SyncSpill flag i
28cb0 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d  s set during tim
28cc0 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  es when doing a 
28cd0 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75  sync of.  ** jou
28ce0 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67  rnal (and adding
28cf0 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69   a new header) i
28d00 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20  s not allowed.  
28d10 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a  This occurs.  **
28d20 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f   during calls to
28d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28d40 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e  te() while tryin
28d50 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c  g to journal mul
28d60 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73  tiple.  ** pages
28d70 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
28d80 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20  e same sector.. 
28d90 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e   **.  ** The doN
28da0 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68  otSpill flag inh
28db0 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20  ibits all cache 
28dc0 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c  spilling regardl
28dd0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a 20  ess of whether. 
28de0 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e   ** or not a syn
28df0 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  c is required.  
28e00 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69  This is set duri
28e10 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20  ng a rollback.. 
28e20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e   **.  ** Spillin
28e30 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62  g is also prohib
28e40 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20  ited when in an 
28e50 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63  error state sinc
28e60 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a  e that could.  *
28e70 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  * lead to databa
28e80 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
28e90 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
28ea0 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74  implementaton it
28eb0 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73   .  ** is imposs
28ec0 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ible for sqlite3
28ed0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f  PcacheFetch() to
28ee0 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
28ef0 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20 20  createFlag==1.  
28f00 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  ** while in the 
28f10 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e  error state, hen
28f20 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
28f30 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
28f40 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20  tine to.  ** be 
28f50 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72  called in the er
28f60 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65  ror state.  Neve
28f70 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63  rtheless, we inc
28f80 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20  lude a NEVER(). 
28f90 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65   ** test for the
28fa0 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20   error state as 
28fb0 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69  a safeguard agai
28fc0 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
28fd0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  es..  */.  if( N
28fe0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
28ff0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53  Code) ) return S
29000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
29010 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
29020 6c 6c 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ll ) return SQLI
29030 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
29040 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
29050 69 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c 61  ill && (pPg->fla
29060 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
29070 53 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20 20  SYNC)!=0 ){.    
29080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29090 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
290a0 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
290b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
290c0 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
290d0 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
290e0 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
290f0 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
29100 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
29110 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
29120 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62   .      rc = sub
29130 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
29140 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ; .    }.    if(
29150 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29160 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
29170 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
29180 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 2c 20 30  er, pPg, 0, 0, 0
29190 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
291a0 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63  {.  .    /* Sync
291b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
291c0 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  e if required. *
291d0 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66  /.    if( pPg->f
291e0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
291f0 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50  SYNC .     || pP
29200 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
29210 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
29220 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  MOD.    ){.     
29230 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
29240 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  l(pPager, 1);.  
29250 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
29260 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
29270 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73   of this page is
29280 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
29290 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
292a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
292b0 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d  base image, it m
292c0 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72  ay need to be wr
292d0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
292e0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a  -journal..    **
292f0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
29300 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67   the call to pag
29310 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
29320 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  t() below will n
29330 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  ot.    ** actual
29340 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74 6f  ly write data to
29350 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69   the file in thi
29360 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20  s case..    **. 
29370 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74     ** Consider t
29380 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71  he following seq
29390 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a  uence of events:
293a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
293b0 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20   BEGIN;.    **  
293c0 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
293d0 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c   X>.    **     <
293e0 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20  modify page X>. 
293f0 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f     **     SAVEPO
29400 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20  INT sp;.    **  
29410 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74       <shrink dat
29420 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20  abase file to Y 
29430 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20  pages>.    **   
29440 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28      pagerStress(
29450 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20  page X).    **  
29460 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73     ROLLBACK TO s
29470 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  p;.    **.    **
29480 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20   If (X>Y), then 
29490 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73  when pagerStress
294a0 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20   is called page 
294b0 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  X will not be wr
294c0 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74  itten.    ** out
294d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
294e0 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20   file, but will 
294f0 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
29500 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c  the cache. Then,
29510 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
29520 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  g the "ROLLBACK 
29530 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74  TO sp" statement
29540 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58  , reading page X
29550 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a   will read.    *
29560 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
29570 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
29580 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
29590 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61  copy of page X a
295a0 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20  s it.    ** was 
295b0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
295c0 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f  tion started, no
295d0 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
295e0 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a   "SAVEPOINT sp".
295f0 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75      ** was execu
29600 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
29610 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
29620 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  is to write the 
29630 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72  current data for
29640 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65   page X into the
29650 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75   .    ** sub-jou
29660 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69  rnal file now (i
29670 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
29680 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74  ady there), so t
29690 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20  hat it will.    
296a0 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ** be restored t
296b0 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  o its current va
296c0 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f  lue when the "RO
296d0 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73  LLBACK TO sp" is
296e0 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65   .    ** execute
296f0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
29700 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20  ( NEVER(.       
29710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29720 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  & pPg->pgno>pPag
29730 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75  er->dbSize && su
29740 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
29750 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20  Pg).    ) ){.   
29760 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
29770 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
29780 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69   }.  .    /* Wri
29790 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
297a0 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  of the page out 
297b0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
297c0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
297d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
297e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
297f0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
29800 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
29810 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
29820 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
29830 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  st(pPager, pPg);
29840 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29850 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
29860 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66  s clean. */.  if
29870 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29880 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
29890 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
298a0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
298b0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
298c0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
298d0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
298e0 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  an(pPg);.  }..  
298f0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
29900 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20  or(pPager, rc); 
29910 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
29920 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
29930 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
29940 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
29950 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
29960 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
29970 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
29980 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
29990 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
299a0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
299b0 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
299c0 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
299d0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
299e0 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
299f0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
29a00 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
29a10 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
29a20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
29a30 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
29a40 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
29a50 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
29a60 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
29a70 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
29a80 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
29a90 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
29aa0 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
29ab0 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
29ac0 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
29ad0 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
29ae0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
29af0 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
29b00 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
29b10 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
29b20 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
29b30 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
29b40 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
29b50 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
29b60 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
29b70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
29b80 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
29b90 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
29ba0 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
29bb0 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
29bc0 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
29bd0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
29be0 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
29bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
29c00 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
29c10 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
29c20 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
29c30 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
29c40 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
29c50 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
29c60 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
29c70 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
29c80 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
29c90 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
29ca0 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
29cb0 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
29cc0 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
29cd0 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
29ce0 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
29cf0 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
29d00 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
29d10 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
29d20 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
29d30 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
29d40 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
29d50 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
29d60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
29d70 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
29d80 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
29d90 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
29da0 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
29db0 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
29dc0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
29dd0 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
29de0 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
29df0 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
29e00 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
29e10 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
29e20 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
29e30 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
29e40 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
29e50 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
29e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
29e70 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
29e80 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
29e90 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
29ea0 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
29eb0 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
29ec0 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
29ed0 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
29ee0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
29ef0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
29f00 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
29f10 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
29f20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
29f30 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
29f40 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
29f50 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
29f60 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
29f70 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
29f80 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
29f90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
29fa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
29fb0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
29fc0 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
29fd0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
29fe0 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
29ff0 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2a000 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
2a010 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a020 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
2a030 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
2a040 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
2a050 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2a060 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
2a070 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
2a080 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
2a090 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
2a0a0 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
2a0b0 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
2a0c0 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
2a0d0 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
2a0e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2a0f0 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
2a100 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
2a110 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
2a120 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2a130 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
2a140 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2a150 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
2a160 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2a170 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
2a180 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
2a190 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
2a1a0 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
2a1b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a1c0 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
2a1d0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
2a1e0 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
2a1f0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2a200 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
2a210 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
2a220 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
2a230 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
2a240 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2a250 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
2a260 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
2a270 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
2a280 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
2a290 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
2a2a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
2a2b0 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
2a2c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2a2d0 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
2a2e0 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
2a2f0 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
2a300 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
2a310 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
2a320 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
2a330 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
2a340 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
2a350 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
2a360 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
2a370 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
2a380 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
2a390 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
2a3a0 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
2a3b0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2a3c0 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
2a3d0 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67  e */.  u32 szPag
2a3e0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
2a3f0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2a400 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
2a410 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e  ge size */.  con
2a420 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20  st char *zUri = 
2a430 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67  0;    /* URI arg
2a440 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
2a450 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20  nt nUri = 0;    
2a460 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a470 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52  r of bytes of UR
2a480 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20  I args at *zUri 
2a490 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
2a4a0 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
2a4b0 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
2a4c0 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2a4d0 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
2a4e0 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
2a4f0 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
2a500 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
2a510 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
2a520 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65  This.  ** is the
2a530 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72   maximum space r
2a540 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69  equired for an i
2a550 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
2a560 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20   file handle .  
2a570 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72  ** and a regular
2a580 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
2a590 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20  ndle. Note that 
2a5a0 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  a "regular journ
2a5b0 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20  al-handle".  ** 
2a5c0 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72  may be a wrapper
2a5d0 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68   capable of cach
2a5e0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f  ing the first po
2a5f0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  rtion of the jou
2a600 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
2a610 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c  n memory to impl
2a620 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63  ement the atomic
2a630 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
2a640 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73  ion (see .  ** s
2a650 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e  ource file journ
2a660 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  al.c)..  */.  if
2a670 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  ( sqlite3Journal
2a680 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74  Size(pVfs)>sqlit
2a690 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
2a6a0 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  () ){.    journa
2a6b0 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
2a6c0 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  D8(sqlite3Journa
2a6d0 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20  lSize(pVfs));.  
2a6e0 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e  }else{.    journ
2a6f0 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2a700 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  ND8(sqlite3MemJo
2a710 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20  urnalSize());.  
2a720 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
2a730 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
2a740 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20  to NULL in case 
2a750 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
2a760 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
2a770 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   0;..#ifndef SQL
2a780 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
2a790 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  B.  if( flags & 
2a7a0 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a  PAGER_MEMORY ){.
2a7b0 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
2a7c0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
2a7d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2a7e0 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
2a7f0 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
2a800 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
2a810 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
2a820 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
2a830 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
2a840 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
2a850 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
2a860 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
2a870 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
2a880 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
2a890 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
2a8a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2a8b0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2a8c0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e  me[0] ){.    con
2a8d0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
2a8e0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
2a8f0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2a900 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2a910 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50  sqlite3Malloc(nP
2a920 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
2a930 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2a940 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a950 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2a960 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61     }.    zPathna
2a970 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
2a980 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
2a990 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
2a9a0 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
2a9b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2a9c0 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
2a9d0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
2a9e0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
2a9f0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e  Pathname);.    n
2aa00 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2aa10 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2aa20 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a  name);.    z = z
2aa30 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65  Uri = &zFilename
2aa40 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
2aa50 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a  (zFilename)+1];.
2aa60 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
2aa70 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2aa80 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2aa90 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
2aaa0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2aab0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72  1;.    }.    nUr
2aac0 69 20 3d 20 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  i = &z[1] - zUri
2aad0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2aae0 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
2aaf0 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
2ab00 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
2ab10 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2ab20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
2ab30 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
2ab40 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2ab50 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2ab60 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
2ab70 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
2ab80 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2ab90 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
2aba0 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
2abb0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
2abc0 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
2abd0 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
2abe0 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
2abf0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
2ac00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ac10 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
2ac20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
2ac30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
2ac40 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
2ac50 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2ac60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2ac70 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2ac80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ac90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2aca0 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
2acb0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2acc0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
2acd0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
2ace0 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65  ory for the Page
2acf0 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61  r structure, PCa
2ad00 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a  che object, the.
2ad10 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20    ** three file 
2ad20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65  descriptors, the
2ad30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2ad40 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  ame and the jour
2ad50 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e  nal .  ** file n
2ad60 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20  ame. The layout 
2ad70 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20  in memory is as 
2ad80 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2ad90 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a  **     Pager obj
2ada0 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2adb0 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50         (sizeof(P
2adc0 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a  ager) bytes).  *
2add0 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a  *     PCache obj
2ade0 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2adf0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63        (sqlite3Pc
2ae00 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73  acheSize() bytes
2ae10 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2ae20 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
2ae30 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73             (pVfs
2ae40 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73  ->szOsFile bytes
2ae50 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a  ).  **     Sub-j
2ae60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2ae70 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72  le         (jour
2ae80 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2ae90 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e  s).  **     Main
2aea0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2aeb0 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75  ndle        (jou
2aec0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2aed0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2aee0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2af00 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29  athname+1 bytes)
2af10 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  .  **     Journa
2af20 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  l file name     
2af30 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2af40 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a  name+8+1 bytes).
2af50 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75    */.  pPtr = (u
2af60 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  8 *)sqlite3Mallo
2af70 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44  cZero(.    ROUND
2af80 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2af90 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67  )) +      /* Pag
2afa0 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
2afb0 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68      ROUND8(pcach
2afc0 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20  eSize) +        
2afd0 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
2afe0 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ect */.    ROUND
2aff0 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2b000 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ) +       /* The
2b010 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
2b020 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2b030 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20  Size * 2 +      
2b040 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
2b050 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
2b060 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2b070 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20   1 + nUri +     
2b080 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2b090 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   */.    nPathnam
2b0a0 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20  e + 8 + 1       
2b0b0 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e         /* zJourn
2b0c0 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  al */.#ifndef SQ
2b0d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2b0e0 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20    + nPathname + 
2b0f0 34 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20  4 + 1           
2b100 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65     /* zWal */.#e
2b110 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65  ndif.  );.  asse
2b120 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2b130 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
2b140 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
2b150 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
2b160 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
2b170 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2b180 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2b190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b1a0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
2b1b0 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
2b1c0 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
2b1d0 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
2b1e0 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
2b1f0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2b200 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2b210 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
2b220 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
2b230 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2b240 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
2b250 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
2b260 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
2b270 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2b280 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2b290 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
2b2a0 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
2b2b0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
2b2c0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
2b2d0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2b2e0 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
2b2f0 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2b300 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
2b310 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2b320 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
2b330 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
2b340 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
2b350 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
2b360 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
2b370 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
2b380 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
2b390 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  thname ){.    as
2b3a0 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e  sert( nPathname>
2b3b0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
2b3c0 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63  >zJournal =   (c
2b3d0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50  har*)(pPtr += nP
2b3e0 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55  athname + 1 + nU
2b3f0 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2b400 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2b410 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
2b420 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2b430 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46  mcpy(&pPager->zF
2b440 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d  ilename[nPathnam
2b450 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69  e+1], zUri, nUri
2b460 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2b470 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2b480 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2b490 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2b4a0 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
2b4b0 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
2b4c0 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a  "-journal", 8);.
2b4d0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2b4e0 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2b4f0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2b500 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66  ->zJournal);.#if
2b510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b520 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d  _WAL.    pPager-
2b530 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  >zWal = &pPager-
2b540 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2b550 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65  ame+8+1];.    me
2b560 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61  mcpy(pPager->zWa
2b570 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2b580 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2b590 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57  mcpy(&pPager->zW
2b5a0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2b5b0 2d 77 61 6c 22 2c 20 34 29 3b 0a 20 20 20 20 73  -wal", 4);.    s
2b5c0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2b5d0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2b5e0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  ame, pPager->zWa
2b5f0 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  l);.#endif.    s
2b600 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
2b610 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
2b620 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
2b630 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
2b640 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
2b650 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
2b660 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
2b670 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2b680 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2b690 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75  ] ){.    int fou
2b6a0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2b6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
2b6c0 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2b6d0 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  by xOpen() */.  
2b6e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2b6f0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2b700 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2b710 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61  ager->fd, vfsFla
2b720 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  gs, &fout);.    
2b730 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29  assert( !memDb )
2b740 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
2b750 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
2b760 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
2b770 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
2b780 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
2b790 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
2b7a0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
2b7b0 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61  .    ** choose a
2b7c0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2b7d0 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61  ze in case we ha
2b7e0 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ve to create the
2b7f0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2b800 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
2b810 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
2b820 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
2b830 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2b840 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
2b850 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
2b860 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
2b870 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
2b880 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
2b890 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b  ze().    **    +
2b8a0 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
2b8b0 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
2b8c0 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
2b8d0 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  cally..    */.  
2b8e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b8f0 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
2b900 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63   ){.      setSec
2b910 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2b920 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51  .      assert(SQ
2b930 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2b940 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
2b950 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2b960 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28  SIZE);.      if(
2b970 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
2b980 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
2b990 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
2b9a0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2b9b0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
2b9c0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
2b9d0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
2b9e0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
2b9f0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2ba00 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65  SIZE;.        }e
2ba10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2ba20 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32  zPageDflt = (u32
2ba30 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
2ba40 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ize;.        }. 
2ba50 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2ba60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2ba70 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b  IC_WRITE.      {
2ba80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63  .        int iDc
2ba90 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
2baa0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2bab0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
2bac0 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
2bad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2bae0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2baf0 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
2bb00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2bb10 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2bb20 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
2bb30 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
2bb40 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
2bb50 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2bb60 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
2bb70 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
2bb80 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
2bb90 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2bba0 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
2bbb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2bbc0 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
2bbd0 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
2bbe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bbf0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
2bc00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2bc10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
2bc20 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65  endif.    }.  }e
2bc30 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
2bc40 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2bc50 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
2bc60 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
2bc70 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2bc80 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
2bc90 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
2bca0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2bcb0 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
2bcc0 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
2bcd0 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
2bce0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
2bcf0 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
2bd00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2bd10 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
2bd20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
2bd30 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
2bd40 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
2bd50 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
2bd60 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
2bd70 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
2bd80 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
2bd90 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
2bda0 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
2bdb0 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
2bdc0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
2bdd0 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
2bde0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
2bdf0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
2be00 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  DER;.    pPager-
2be10 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49  >eLock = EXCLUSI
2be20 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 61  VE_LOCK;.    rea
2be30 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67  dOnly = (vfsFlag
2be40 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s&SQLITE_OPEN_RE
2be50 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20  ADONLY);.  }..  
2be60 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2be70 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65   call to PagerSe
2be80 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76  tPagesize() serv
2be90 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61  es to set the va
2bea0 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67  lue of .  ** Pag
2beb0 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20  er.pageSize and 
2bec0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
2bed0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
2bee0 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  buffer..  */.  i
2bef0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bf00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2bf10 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
2bf20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2bf30 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
2bf40 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a  size(pPager, &sz
2bf50 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20  PageDflt, -1);. 
2bf60 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
2bf70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2bf80 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
2bf90 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20  ror occurred in 
2bfa0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c  either of the bl
2bfb0 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65  ocks above, free
2bfc0 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
2bfd0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
2bfe0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20  lose the file.. 
2bff0 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51   */.  if( rc!=SQ
2c000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2c010 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2c020 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20  pTmpSpace );.   
2c030 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2c040 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2c050 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
2c060 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
2c070 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
2c080 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50  Initialize the P
2c090 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f  Cache object. */
2c0a0 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72  .  assert( nExtr
2c0b0 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74  a<1000 );.  nExt
2c0c0 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74  ra = ROUND8(nExt
2c0d0 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ra);.  sqlite3Pc
2c0e0 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44  acheOpen(szPageD
2c0f0 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65  flt, nExtra, !me
2c100 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mDb,.           
2c110 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
2c120 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
2c130 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
2c140 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2c150 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2c160 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
2c170 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61  FILEHANDLEID(pPa
2c180 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72  ger->fd), pPager
2c190 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  ->zFilename));. 
2c1a0 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
2c1b0 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
2c1c0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2c1d0 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d  ame))..  pPager-
2c1e0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  >useJournal = (u
2c1f0 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20  8)useJournal;.  
2c200 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
2c210 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b  ck = (noReadlock
2c220 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31   && readOnly) ?1
2c230 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  :0;.  /* pPager-
2c240 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
2c250 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2c260 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
2c270 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
2c280 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ef = 0; */.  /* 
2c290 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
2c2a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2c2b0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
2c2c0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2c2d0 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
2c2e0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
2c2f0 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
2c300 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
2c310 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
2c320 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
2c330 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
2c340 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2c350 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
2c360 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2c370 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
2c380 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70  );.#endif.  /* p
2c390 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
2c3a0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2c3b0 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
2c3c0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
2c3d0 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
2c3e0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2c3f0 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
2c400 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
2c410 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2c420 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2c430 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2c440 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2c450 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
2c460 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2c470 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2c480 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
2c490 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
2c4a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2c4b0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
2c4c0 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
2c4d0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2c4e0 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
2c4f0 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
2c500 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
2c510 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
2c520 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
2c530 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2c540 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
2c550 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e  Sync = pPager->n
2c560 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50  oSync ?0:1;.  pP
2c570 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
2c580 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
2c590 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 53 59   ? 0 : SQLITE_SY
2c5a0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 50 61  NC_NORMAL;.  pPa
2c5b0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2c5c0 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e  gs = pPager->syn
2c5d0 63 46 6c 61 67 73 3b 0a 20 20 2f 2a 20 70 50 61  cFlags;.  /* pPa
2c5e0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
2c5f0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2c600 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
2c610 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2c620 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
2c630 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
2c640 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
2c650 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
2c660 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
2c670 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
2c680 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
2c690 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2c6a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
2c6b0 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
2c6c0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2c6d0 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
2c6e0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
2c6f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2c700 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2c710 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
2c720 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
2c730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2c740 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2c750 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2c760 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
2c770 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
2c780 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
2c790 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
2c7a0 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
2c7b0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
2c7c0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
2c7d0 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
2c7e0 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
2c7f0 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2c800 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  h)); */..  *ppPa
2c810 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
2c820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c830 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
2c840 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2c850 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
2c860 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
2c870 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
2c880 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
2c890 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
2c8a0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2c8b0 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
2c8c0 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
2c8d0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
2c8e0 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
2c8f0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
2c900 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
2c910 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
2c920 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
2c930 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
2c940 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
2c950 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
2c960 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2c970 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
2c980 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
2c990 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2c9a0 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
2c9b0 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
2c9c0 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
2c9d0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2c9e0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
2c9f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2ca00 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2ca10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
2ca20 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
2ca30 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
2ca40 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
2ca50 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
2ca60 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2ca70 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
2ca80 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
2ca90 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
2caa0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2cab0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
2cac0 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
2cad0 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
2cae0 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
2caf0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
2cb00 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
2cb10 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
2cb20 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
2cb30 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
2cb40 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2cb50 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
2cb60 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
2cb70 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
2cb80 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
2cb90 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2cba0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2cbb0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2cbc0 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
2cbd0 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
2cbe0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
2cbf0 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
2cc00 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
2cc10 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
2cc20 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
2cc30 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
2cc40 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
2cc50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2cc60 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2cc70 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
2cc80 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
2cc90 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
2cca0 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
2ccb0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2ccc0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
2ccd0 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
2cce0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ccf0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2cd00 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
2cd10 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
2cd20 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
2cd30 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2cd40 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
2cd50 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2cd60 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
2cd70 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2cd80 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
2cd90 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2cda0 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
2cdb0 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
2cdc0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2cdd0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2cde0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2cdf0 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
2ce00 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2ce10 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
2ce20 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2ce30 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
2ce40 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
2ce50 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2ce60 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
2ce70 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
2ce80 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
2ce90 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2cea0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
2ceb0 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
2cec0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2ced0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2cee0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2cef0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2cf00 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2cf10 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
2cf20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2cf30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2cf40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2cf50 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
2cf60 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
2cf70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2cf80 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
2cf90 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2cfa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2cfb0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2cfc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2cfd0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2cfe0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
2cff0 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
2d000 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
2d010 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2d020 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
2d030 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
2d040 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
2d050 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
2d060 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
2d070 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
2d080 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
2d090 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2d0a0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2d0b0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
2d0c0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
2d0d0 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
2d0e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d0f0 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
2d100 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
2d110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d120 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
2d130 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2d140 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
2d150 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
2d160 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
2d170 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
2d180 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
2d190 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
2d1a0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
2d1b0 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
2d1c0 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
2d1d0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2d1e0 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
2d1f0 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
2d200 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2d210 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
2d220 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
2d230 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
2d240 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
2d250 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2d260 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
2d270 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
2d280 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
2d290 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
2d2a0 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
2d2b0 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
2d2c0 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
2d2d0 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
2d2e0 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
2d2f0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
2d300 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
2d310 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
2d320 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
2d330 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
2d340 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
2d350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2d360 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2d370 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
2d380 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
2d390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d3a0 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
2d3b0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
2d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d3d0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2d3e0 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
2d3f0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43  e */..      /* C
2d400 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66  heck the size of
2d410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d420 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73  le. If it consis
2d430 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20  ts of 0 pages,. 
2d440 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c       ** then del
2d450 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2d460 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65  file. See the he
2d470 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f  ader comment abo
2d480 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a  ve for .      **
2d490 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68   the reasoning h
2d4a0 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ere.  Delete the
2d4b0 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
2d4c0 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20  l file under.   
2d4d0 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44     ** a RESERVED
2d4e0 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72   lock to avoid r
2d4f0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  ace conditions a
2d500 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c  nd to avoid viol
2d510 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b  ating.      ** [
2d520 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a  H33020]..      *
2d530 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
2d540 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2d550 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
2d560 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d580 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
2d590 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d5a0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
2d5b0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oc();.          
2d5c0 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  if( pagerLockDb(
2d5d0 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
2d5e0 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
2d5f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2d600 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
2d610 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2d620 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
2d630 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2d640 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2d650 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63  ode ) pagerUnloc
2d660 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
2d670 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2d680 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d690 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
2d6a0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2d6b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d6c0 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
2d6d0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2d6e0 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
2d6f0 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
2d700 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
2d710 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
2d720 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2d730 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
2d740 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
2d750 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
2d760 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
2d770 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
2d780 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
2d790 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
2d7a0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
2d7b0 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
2d7c0 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
2d7d0 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
2d7e0 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
2d7f0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
2d800 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
2d810 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2d820 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2d830 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
2d840 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2d850 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
2d860 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2d870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2d880 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2d890 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2d8a0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2d8b0 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
2d8c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d8d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d8e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d8f0 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
2d900 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2d910 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2d920 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
2d930 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
2d940 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2d950 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d960 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
2d970 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
2d980 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2d990 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
2d9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d9b0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2d9c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2d9d0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
2d9e0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
2d9f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2da00 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
2da10 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
2da20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2da30 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
2da40 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
2da50 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
2da60 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
2da70 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
2da80 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
2da90 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
2daa0 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f  * its has a zero
2dab0 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
2dac0 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
2dad0 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
2dae0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
2daf0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
2db00 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
2db10 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
2db20 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
2db30 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
2db40 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
2db50 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
2db60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
2db70 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
2db80 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
2db90 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
2dba0 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
2dbb0 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
2dbc0 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
2dbd0 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
2dbe0 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
2dbf0 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
2dc00 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
2dc10 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
2dc20 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
2dc30 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
2dc40 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
2dc50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
2dc60 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
2dc70 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
2dc80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
2dc90 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
2dca0 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
2dcb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2dcc0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2dcd0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2dce0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2dcf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2dd00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2dd10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2dd20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
2dd30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2dd40 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
2dd50 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
2dd60 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2dd70 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
2dd80 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
2dd90 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
2dda0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
2ddb0 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
2ddc0 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
2ddd0 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
2dde0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2ddf0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
2de00 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
2de10 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
2de20 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
2de30 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
2de40 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2de50 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
2de60 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
2de70 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
2de80 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
2de90 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
2dea0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
2deb0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2dec0 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
2ded0 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
2dee0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
2def0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
2df00 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
2df10 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
2df20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
2df30 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
2df40 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
2df50 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
2df60 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
2df70 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
2df80 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
2df90 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
2dfa0 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
2dfb0 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
2dfc0 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
2dfd0 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
2dfe0 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
2dff0 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
2e000 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
2e010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e020 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
2e030 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
2e040 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
2e050 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
2e060 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
2e070 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
2e080 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
2e090 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
2e0a0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
2e0b0 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
2e0c0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
2e0d0 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
2e0e0 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
2e0f0 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
2e100 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
2e110 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
2e120 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
2e130 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
2e140 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
2e150 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
2e160 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
2e170 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
2e180 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
2e190 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
2e1a0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2e1b0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2e1c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2e1d0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2e1e0 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
2e1f0 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
2e200 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
2e210 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2e220 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
2e230 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
2e240 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
2e250 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2e260 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2e270 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
2e280 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
2e290 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2e2a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e2c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2e2d0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2e2e0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
2e2f0 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
2e300 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
2e310 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
2e320 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
2e330 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
2e340 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
2e350 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
2e360 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
2e370 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
2e380 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
2e390 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
2e3a0 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
2e3b0 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
2e3c0 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  s mode..  */.  a
2e3d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
2e3e0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
2e3f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
2e400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
2e410 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2e420 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
2e430 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2e440 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2e450 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2e460 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
2e470 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
2e480 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
2e490 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74  >errCode) ){ ret
2e4a0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
2e4b0 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70  ode; }..  if( !p
2e4c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2e4d0 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
2e4e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2e4f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
2e500 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
2e510 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e520 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
2e530 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
2e540 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
2e550 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
2e560 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2e570 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20  oReadlock==0 || 
2e580 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2e590 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   );..    if( pPa
2e5a0 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d  ger->noReadlock=
2e5b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2e5c0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
2e5d0 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
2e5e0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2e5f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e600 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
2e610 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
2e620 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck==NO_LOCK || p
2e630 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
2e640 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
2e650 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2e660 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
2e670 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
2e680 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2e690 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
2e6a0 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
2e6b0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
2e6c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
2e6d0 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
2e6e0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2e6f0 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
2e700 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2e710 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53  pPager->eLock<=S
2e720 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
2e730 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
2e740 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
2e750 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  bHotJournal);.  
2e760 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
2e770 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e780 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2e790 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48      }.    if( bH
2e7a0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
2e7b0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
2e7c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2e7d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e7e0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
2e7f0 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
2e800 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
2e810 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
2e820 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
2e830 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
2e840 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
2e850 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
2e860 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
2e870 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
2e880 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
2e890 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
2e8a0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
2e8b0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
2e8c0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
2e8d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2e8e0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
2e8f0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
2e900 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
2e910 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
2e920 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
2e930 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
2e940 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
2e950 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
2e960 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
2e970 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
2e980 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
2e990 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
2e9a0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
2e9b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e9c0 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
2e9d0 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
2e9e0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
2e9f0 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
2ea00 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
2ea10 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
2ea20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2ea30 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
2ea40 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
2ea50 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
2ea60 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
2ea70 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
2ea80 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
2ea90 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
2eaa0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
2eab0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
2eac0 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
2ead0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2eae0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
2eaf0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
2eb00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2eb10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2eb20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2eb30 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
2eb40 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
2eb50 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
2eb60 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
2eb70 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
2eb80 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
2eb90 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
2eba0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
2ebb0 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
2ebc0 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
2ebd0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
2ebe0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
2ebf0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
2ec00 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
2ec10 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
2ec20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
2ec30 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
2ec40 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
2ec50 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
2ec60 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
2ec70 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
2ec80 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
2ec90 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
2eca0 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
2ecb0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
2ecc0 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
2ecd0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
2ece0 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
2ecf0 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
2ed00 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
2ed10 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
2ed20 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
2ed30 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
2ed40 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
2ed50 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
2ed60 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
2ed70 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
2ed80 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
2ed90 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
2eda0 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
2edb0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
2edc0 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
2edd0 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
2ede0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
2edf0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
2ee00 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
2ee10 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
2ee20 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
2ee30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ee40 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
2ee50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ee60 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2ee70 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2ee80 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
2ee90 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
2eea0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
2eeb0 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
2eec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2eed0 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2eee0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
2eef0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2ef00 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
2ef10 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
2ef20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2ef30 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
2ef40 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
2ef50 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
2ef60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ef70 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
2ef80 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
2ef90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
2efa0 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
2efb0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
2efc0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2efd0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2efe0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2eff0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
2f000 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f010 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2f020 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2f030 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
2f040 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
2f050 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
2f060 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
2f070 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2f080 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2f090 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f0a0 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
2f0b0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2f0d0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2f0e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2f0f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2f100 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2f110 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f120 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
2f130 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
2f140 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
2f150 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
2f160 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
2f170 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
2f180 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
2f190 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
2f1a0 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
2f1b0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
2f1c0 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
2f1d0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
2f1e0 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
2f1f0 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
2f200 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
2f210 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
2f220 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
2f230 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
2f240 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
2f250 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
2f260 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
2f270 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
2f280 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
2f290 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
2f2a0 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
2f2b0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
2f2c0 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
2f2d0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
2f2e0 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
2f2f0 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
2f300 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
2f310 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2f320 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2f330 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f340 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2f350 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
2f360 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
2f370 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2f380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f390 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
2f3a0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2f3b0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  1);.          pP
2f3c0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2f3d0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
2f3e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2f3f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
2f400 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
2f410 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
2f420 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
2f430 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2f440 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
2f450 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f460 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
2f470 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
2f480 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2f490 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
2f4a0 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
2f4b0 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
2f4c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
2f4d0 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
2f4e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
2f4f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2f500 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
2f510 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
2f520 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
2f530 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
2f540 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
2f550 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
2f560 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
2f570 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
2f580 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
2f590 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
2f5a0 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
2f5b0 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
2f5c0 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
2f5d0 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
2f5e0 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
2f5f0 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
2f600 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
2f610 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
2f620 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
2f630 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
2f640 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
2f650 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
2f660 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
2f670 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
2f680 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
2f690 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
2f6a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
2f6b0 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
2f6c0 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
2f6d0 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
2f6e0 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
2f6f0 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
2f700 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
2f710 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
2f720 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
2f730 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
2f740 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
2f750 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2f760 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
2f770 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
2f780 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
2f790 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
2f7a0 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
2f7b0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
2f7c0 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
2f7d0 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
2f7e0 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
2f7f0 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
2f800 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
2f810 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
2f820 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
2f830 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
2f840 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2f850 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
2f860 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
2f870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2f880 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2f890 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
2f8a0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
2f8b0 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
2f8c0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
2f8d0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
2f8e0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
2f8f0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
2f900 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
2f910 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2f920 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
2f930 69 6c 65 20 0a 20 20 20 20 20 26 26 20 28 70 50  ile .     && (pP
2f940 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c  ager->pBackup ||
2f950 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
2f960 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
2f970 70 50 43 61 63 68 65 29 3e 30 29 20 0a 20 20 20  pPCache)>0) .   
2f980 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2f990 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
2f9a0 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
2f9b0 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
2f9c0 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  ase file.      *
2f9d0 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
2f9e0 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
2f9f0 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
2fa00 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
2fa10 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
2fa20 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
2fa30 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
2fa40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
2fa50 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
2fa60 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
2fa70 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
2fa80 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
2fa90 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
2faa0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
2fab0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
2fac0 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
2fad0 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
2fae0 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
2faf0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
2fb00 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
2fb10 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
2fb20 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
2fb30 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
2fb40 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
2fb50 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
2fb60 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
2fb70 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
2fb80 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
2fb90 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
2fba0 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
2fbb0 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
2fbc0 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
2fbd0 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
2fbe0 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
2fbf0 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
2fc00 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
2fc10 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
2fc20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
2fc30 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
2fc40 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
2fc50 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
2fc60 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
2fc70 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
2fc80 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
2fc90 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
2fca0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20     Pgno nPage = 
2fcb0 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  0;.      char db
2fcc0 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
2fcd0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2fce0 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20  rs)];..      rc 
2fcf0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
2fd00 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2fd10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2fd20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20   goto failed;.. 
2fd30 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30       if( nPage>0
2fd40 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
2fd50 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
2fd60 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
2fd70 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
2fd80 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
2fd90 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
2fda0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
2fdb0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
2fdc0 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
2fdd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2fde0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fdf0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
2fe00 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
2fe10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fe20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
2fe30 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
2fe40 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
2fe50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
2fe60 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
2fe70 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
2fe80 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
2fe90 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
2fea0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
2feb0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
2fec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2fed0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2fee0 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e  is a WAL file in
2fef0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2ff00 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61  , open this data
2ff10 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20  base in WAL.    
2ff20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69  ** mode. Otherwi
2ff30 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  se, the followin
2ff40 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  g function call 
2ff50 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
2ff60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
2ff70 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
2ff80 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64  t(pPager);.#ifnd
2ff90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2ffa0 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  AL.    assert( p
2ffb0 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c  Pager->pWal==0 |
2ffc0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
2ffd0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
2ffe0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
2fff0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
30000 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
30010 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
30020 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  = pagerBeginRead
30030 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
30040 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
30050 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30060 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63  PAGER_OPEN && rc
30070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30080 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
30090 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
300a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
300b0 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
300c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
300d0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
300e0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
300f0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
30100 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
30110 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
30120 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
30130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
30140 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
30150 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a  GER_READER;.  }.
30160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30170 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
30180 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
30190 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
301a0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
301b0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
301c0 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
301d0 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
301e0 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
301f0 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
30200 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
30210 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
30220 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
30230 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
30240 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
30250 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
30260 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
30270 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
30280 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
30290 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
302a0 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
302b0 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
302c0 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c  ger){.  if( (sql
302d0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
302e0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
302f0 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
30300 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
30310 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
30320 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
30330 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
30340 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
30350 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
30360 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
30370 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
30380 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
30390 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
303a0 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
303b0 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
303c0 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
303d0 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
303e0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
303f0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
30400 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
30410 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
30420 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
30430 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
30440 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
30450 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
30460 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
30470 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
30480 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
30490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
304a0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
304b0 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
304c0 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
304d0 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
304e0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
304f0 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
30500 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
30510 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
30520 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
30530 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
30540 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
30550 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
30560 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
30570 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
30580 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
30590 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
305a0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
305b0 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
305c0 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
305d0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
305e0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
305f0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
30600 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
30610 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
30620 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
30630 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
30640 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
30650 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
30660 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
30670 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
30680 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
30690 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
306a0 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
306b0 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
306c0 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
306d0 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
306e0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
306f0 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
30700 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
30710 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
30720 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
30730 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
30740 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
30750 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
30760 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
30770 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
30780 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
30790 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
307a0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
307b0 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
307c0 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
307d0 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
307e0 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65   in two seperate
307f0 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
30800 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
30810 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
30820 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
30830 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
30840 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
30850 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
30860 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
30870 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
30880 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
30890 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
308a0 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
308b0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
308c0 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
308d0 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
308e0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
308f0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
30900 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
30910 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
30920 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
30930 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
30940 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
30950 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
30960 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
30970 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
30980 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
30990 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
309a0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
309b0 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
309c0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
309d0 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
309e0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
309f0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
30a00 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
30a10 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
30a20 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
30a30 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
30a40 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
30a50 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
30a60 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
30a70 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
30a80 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
30a90 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
30aa0 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
30ab0 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
30ac0 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
30ad0 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
30ae0 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
30af0 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
30b00 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
30b10 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
30b20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
30b30 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
30b40 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
30b50 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
30b60 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
30b70 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
30b80 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
30b90 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
30ba0 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
30bb0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
30bc0 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
30bd0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
30be0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
30bf0 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
30c00 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
30c10 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
30c20 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
30c30 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
30c40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
30c50 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
30c60 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
30c70 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
30c80 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
30c90 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
30ca0 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
30cb0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
30cc0 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
30cd0 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
30ce0 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
30cf0 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
30d00 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
30d10 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
30d20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
30d30 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
30d40 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
30d50 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
30d60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30d70 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
30d80 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
30d90 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
30da0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
30db0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
30dc0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
30dd0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
30de0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
30df0 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
30e00 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
30e10 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
30e20 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
30e30 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
30e40 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
30e50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
30e60 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
30e70 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
30e80 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
30e90 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
30ea0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
30eb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
30ec0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
30ed0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
30ee0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
30ef0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
30f00 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
30f10 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a  mmediately. .  *
30f20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71  * Otherwise, req
30f30 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72  uest the page fr
30f40 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61  om the PCache la
30f50 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  yer. */.  if( pP
30f60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
30f70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30f80 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
30f90 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
30fa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30fb0 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
30fc0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
30fd0 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20  , 1, ppPage);.  
30fe0 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
30ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
31000 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c   Either the call
31010 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
31020 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65  eFetch() returne
31030 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68  d an error or th
31040 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77  e.    ** pager w
31050 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  as already in th
31060 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
31070 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
31080 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
31090 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30   ** Set pPg to 0
310a0 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65   and jump to the
310b0 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c   exception handl
310c0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20  er.  */.    pPg 
310d0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61  = 0;.    goto pa
310e0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
310f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
31100 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d  *ppPage)->pgno==
31110 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
31120 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
31130 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28  ger==pPager || (
31140 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
31150 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a  ==0 );..  if( (*
31160 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20  ppPage)->pPager 
31170 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  && !noContent ){
31180 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
31190 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20  case the pcache 
311a0 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
311b0 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   an initialized 
311c0 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74  copy of.    ** t
311d0 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20  he page. Return 
311e0 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20  without further 
311f0 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ado.  */.    ass
31200 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52  ert( pgno<=PAGER
31210 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e  _MAX_PGNO && pgn
31220 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
31230 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
31240 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a  pPager->nHit++;.
31250 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31260 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
31270 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
31280 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
31290 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
312a0 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
312b0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
312c0 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
312d0 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61  .    pPg = *ppPa
312e0 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  ge;.    pPg->pPa
312f0 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
31300 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
31310 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
31320 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
31330 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
31340 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75  a page.    ** nu
31350 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
31360 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75  n this, or the u
31370 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61  nused locking-pa
31380 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ge, is requested
31390 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
313a0 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
313b0 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
313c0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
313d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
313e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
313f0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
31400 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
31410 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
31420 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d  MEMDB || pPager-
31430 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20  >dbSize<pgno || 
31440 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73  noContent || !is
31450 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
31460 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
31470 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
31480 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
31490 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
314a0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
314b0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
314c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
314d0 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
314e0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
314f0 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
31500 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
31510 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
31520 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
31530 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
31540 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
31550 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
31560 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
31570 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
31580 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
31590 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
315a0 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
315b0 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
315c0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
315d0 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
315e0 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
315f0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
31600 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
31610 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
31620 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
31630 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31640 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
31650 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
31660 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
31670 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
31680 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
31690 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
316a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
316b0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
316c0 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
316d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
316e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
316f0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
31700 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
31710 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
31720 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
31730 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
31740 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
31750 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
31760 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31770 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
31780 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
31790 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
317a0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
317b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
317c0 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
317d0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
317e0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
317f0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
31800 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
31810 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
31820 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b  pPager->nMiss++;
31830 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
31840 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
31850 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31870 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
31880 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
31890 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
318a0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
318b0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
318c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
318d0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a  er_acquire_err:.
318e0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
318f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
31900 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69   pPg ){.    sqli
31910 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
31920 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
31930 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
31940 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67  ager);..  *ppPag
31950 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
31960 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
31970 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
31980 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
31990 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
319a0 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
319b0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
319c0 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
319d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
319e0 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
319f0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
31a00 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a  ot in cache. .**
31a10 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
31a20 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
31a30 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
31a40 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
31a50 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
31a60 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
31a70 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
31a80 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
31a90 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
31aa0 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
31ab0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
31ac0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
31ad0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
31ae0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
31af0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
31b00 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
31b10 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
31b20 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
31b30 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
31b40 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
31b50 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
31b60 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
31b70 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
31b80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31b90 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
31ba0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61  ( pgno!=0 );.  a
31bb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
31bc0 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61  PCache!=0 );.  a
31bd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31be0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
31bf0 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
31c00 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
31c10 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  OR );.  sqlite3P
31c20 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
31c30 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
31c40 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65  , 0, &pPg);.  re
31c50 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
31c60 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
31c70 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a  e reference..**.
31c80 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
31c90 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
31ca0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
31cb0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
31cc0 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
31cd0 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
31ce0 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
31cf0 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
31d00 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
31d10 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
31d20 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
31d30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
31d40 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
31d50 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
31d60 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
31d70 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
31d80 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61  f( pPg ){.    Pa
31d90 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
31da0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73  g->pPager;.    s
31db0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
31dc0 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61  ase(pPg);.    pa
31dd0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
31de0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  d(pPager);.  }.}
31df0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
31e00 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31e10 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
31e20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
31e30 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
31e40 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
31e50 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
31e60 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
31e70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
31e80 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
31e90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
31ea0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
31eb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31ec0 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
31ed0 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
31ee0 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
31ef0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
31f00 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
31f10 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
31f20 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
31f30 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
31f40 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
31f50 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
31f60 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
31f70 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
31f80 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
31f90 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
31fa0 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
31fb0 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
31fc0 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
31fd0 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
31fe0 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
31ff0 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
32000 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
32010 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
32020 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
32030 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
32040 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
32050 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
32060 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
32070 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
32080 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
32090 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
320a0 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
320b0 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
320c0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
320d0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
320e0 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
320f0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
32100 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
32110 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
32120 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
32130 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
32140 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
32150 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
32160 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
32170 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
32180 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
32190 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
321a0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
321b0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
321c0 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
321d0 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
321e0 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
321f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
32200 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
32210 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
32220 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
32230 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
32240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
32250 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
32260 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
32270 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
32280 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
32290 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
322a0 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
322b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
322c0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
322d0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73  R_LOCKED );.  as
322e0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
322f0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
32300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
32310 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
32320 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
32330 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
32340 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
32350 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
32360 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
32370 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
32380 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
32390 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
323a0 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
323b0 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
323c0 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
323d0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
323e0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
323f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
32400 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61  Code;..  if( !pa
32410 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
32420 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
32430 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
32440 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
32450 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
32460 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
32470 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
32480 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
32490 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
324a0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
324b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
324c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
324d0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65   }.  .    /* Ope
324e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
324f0 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
32500 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
32510 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
32520 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
32530 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
32540 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
32550 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32560 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
32570 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
32580 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
32590 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65  ->jfd);.      }e
325a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
325b0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
325c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325d0 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f   /* VFS flags to
325e0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
325f0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
32600 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
32610 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
32620 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
32630 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d      (pPager->tem
32640 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20  pFile ? .       
32650 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
32660 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
32670 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
32680 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20  _JOURNAL):.     
32690 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
326a0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
326b0 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
326c0 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45   #ifdef SQLITE_E
326d0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
326e0 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  TE.        rc = 
326f0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
32700 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  en(.            
32710 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32720 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
32730 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
32740 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
32750 72 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  r).        );.  
32760 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63  #else.        rc
32770 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
32780 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
32790 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
327a0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
327b0 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20  .  #endif.      
327c0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
327d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
327e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
327f0 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
32800 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
32810 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
32820 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
32830 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
32840 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
32850 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
32860 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
32870 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
32880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32890 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
328a0 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
328b0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
328c0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
328d0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
328e0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
328f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
32900 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
32910 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
32920 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
32930 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
32940 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
32950 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
32960 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
32970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32980 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
32990 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
329a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
329b0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
329c0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
329d0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
329e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
329f0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
32a00 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65  KED );.    pPage
32a10 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
32a20 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
32a30 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
32a40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
32a50 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
32a60 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
32a70 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
32a80 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
32a90 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
32aa0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
32ab0 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
32ac0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
32ad0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
32ae0 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
32af0 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  t is false, then
32b00 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
32b10 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  t a RESERVED.** 
32b20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
32b30 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78  base file. If ex
32b40 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
32b50 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
32b60 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53  ast.** an EXCLUS
32b70 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63  IVE lock. If suc
32b80 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  h a lock is alre
32b90 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63  ady held, no loc
32ba0 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  king .** functio
32bb0 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65  ns need be calle
32bc0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
32bd0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
32be0 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ument is non-zer
32bf0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d  o, then any sub-
32c00 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a  journal opened.*
32c10 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  * within this tr
32c20 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
32c30 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  e opened as an i
32c40 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54  n-memory file. T
32c50 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66  his.** has no ef
32c60 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d  fect if the sub-
32c70 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61  journal is alrea
32c80 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74  dy opened (as it
32c90 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20   may be when.** 
32ca0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
32cb0 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66  sive mode) or if
32cc0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
32cd0 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
32ce0 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  e a.** sub-journ
32cf0 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49  al. If the subjI
32d00 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
32d10 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
32d20 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73  ny required.** s
32d30 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d  ub-journal is im
32d40 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d  plemented in-mem
32d50 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73  ory if pPager is
32d60 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
32d70 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75  tabase, .** or u
32d80 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79  sing a temporary
32d90 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e   file otherwise.
32da0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
32db0 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20  agerBegin(Pager 
32dc0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46  *pPager, int exF
32dd0 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d  lag, int subjInM
32de0 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63  emory){.  int rc
32df0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
32e00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
32e10 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50  Code ) return pP
32e20 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
32e30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32e40 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
32e50 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d  EADER && pPager-
32e60 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52  >eState<PAGER_ER
32e70 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ROR );.  pPager-
32e80 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20  >subjInMemory = 
32e90 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  (u8)subjInMemory
32ea0 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ;..  if( ALWAYS(
32eb0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32ec0 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b  PAGER_READER) ){
32ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
32ee0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
32ef0 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  =0 );..    if( p
32f00 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
32f10 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
32f20 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
32f30 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
32f40 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
32f50 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a  clusive, and an.
32f60 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
32f70 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
32f80 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
32f90 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74  lready held, obt
32fa0 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ain it now..    
32fb0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
32fc0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
32fd0 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
32fe0 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
32ff0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31  pPager->pWal, -1
33000 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
33010 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
33020 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
33030 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
33040 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
33060 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
33070 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
33080 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
33090 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
330a0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
330b0 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20      /* Grab the 
330c0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
330d0 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
330e0 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61  uccessful, upgra
330f0 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50  de to.      ** P
33100 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
33110 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
33120 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
33130 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
33140 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
33150 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
33160 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
33170 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
33180 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
33190 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
331a0 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
331b0 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
331c0 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
331d0 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
331e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
331f0 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
33200 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
33210 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
33220 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
33230 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
33240 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
33250 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
33260 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
33270 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
33280 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
33290 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
332a0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
332b0 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
332c0 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
332d0 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
332e0 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
332f0 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
33300 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
33310 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
33320 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
33330 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
33340 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
33350 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
33360 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
33370 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
33380 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33390 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  & exFlag ){.    
333a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
333b0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
333c0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
333d0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
333e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
333f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33400 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20     /* Change to 
33410 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
33420 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
33430 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20      ** WAL mode 
33440 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74  sets Pager.eStat
33450 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45  e to PAGER_WRITE
33460 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48  R_LOCKED or CACH
33470 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68  EMOD.      ** wh
33480 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
33490 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
334a0 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f  ut never to DBMO
334b0 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20  D or FINISHED.. 
334c0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
334d0 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65  because in those
334e0 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65   states the code
334f0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61   to roll back sa
33500 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
33510 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d  * transactions m
33520 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
33530 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
33540 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
33550 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ase .      ** fi
33560 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e  le as well as in
33570 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
33580 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
33590 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a  e incorrect in .
335a0 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
335b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
335c0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
335d0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
335e0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50  LOCKED;.      pP
335f0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
33600 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
33610 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
33620 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50  >dbFileSize = pP
33630 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
33640 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
33650 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
33660 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
33670 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
33680 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  f = 0;.    }..  
33690 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
336a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
336b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
336c0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61  _READER );.    a
336d0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
336e0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
336f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
33700 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
33710 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
33720 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
33730 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ager) );.  }..  
33740 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
33750 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
33760 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
33770 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
33780 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
33790 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65  single data page
337a0 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
337b0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
337c0 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
337d0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  main journal or 
337e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72  sub-journal as r
337f0 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20  equired. If the 
33800 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
33810 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  into.** one of t
33820 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  he journals, the
33830 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
33840 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
33850 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f   .** Pager.pInJo
33860 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64  urnal bitvec and
33870 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
33880 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
33890 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61   bitvecs.** of a
338a0 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ny open savepoin
338b0 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ts as appropriat
338c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
338d0 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
338e0 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
338f0 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
33900 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70  Data;.  Pager *p
33910 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
33920 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
33930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
33940 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
33950 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65   not called unle
33960 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ss a write-trans
33970 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
33980 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74  dy .  ** been st
33990 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e  arted. The journ
339a0 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
339b0 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61  ay not be open a
339c0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
339d0 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63  ** It is never c
339e0 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52  alled in the ERR
339f0 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  OR state..  */. 
33a00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33a10 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
33a20 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
33a30 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
33a40 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33a50 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
33a60 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
33a70 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33a80 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
33a90 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
33aa0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
33ab0 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  er) );..  /* If 
33ac0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  an error has bee
33ad0 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74  n previously det
33ae0 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68  ected, report th
33af0 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a  e same error.  *
33b00 2a 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68  * again. This sh
33b10 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c  ould not happen,
33b20 20 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70   but the check p
33b30 72 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65  rovides robustne
33b40 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ss. */.  if( NEV
33b50 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
33b60 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50  de) )  return pP
33b70 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
33b80 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65    /* Higher-leve
33b90 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72  l routines never
33ba0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
33bb0 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20  ion if database 
33bc0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74  is not.  ** writ
33bd0 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b  able.  But check
33be0 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f   anyway, just fo
33bf0 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  r robustness. */
33c00 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
33c10 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  ger->readOnly) )
33c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
33c30 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  ERM;..  CHECK_PA
33c40 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54  GE(pPg);..  /* T
33c50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
33c60 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e  needs to be open
33c70 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c  ed. Higher level
33c80 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61   routines have a
33c90 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61  lready.  ** obta
33ca0 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61  ined the necessa
33cb0 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69  ry locks to begi
33cc0 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  n the write-tran
33cd0 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65  saction, but the
33ce0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  .  ** rollback j
33cf0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
33d00 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70   yet be open. Op
33d10 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69  en it now if thi
33d20 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  s is the case.. 
33d30 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
33d40 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c   done before cal
33d50 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
33d60 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e  heMakeDirty() on
33d70 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a   the page. .  **
33d80 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69   Otherwise, if i
33d90 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65  t were done afte
33da0 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
33db0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
33dc0 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e  (), then.  ** an
33dd0 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63   error might occ
33de0 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ur and the pager
33df0 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e   would end up in
33e00 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
33e10 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70  tate.  ** with p
33e20 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64  ages marked as d
33e30 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68  irty in the cach
33e40 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
33e50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33e60 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
33e70 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  D ){.    rc = pa
33e80 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
33e90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
33ea0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33eb0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
33ec0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
33ed0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
33ee0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
33ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
33f00 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
33f10 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
33f20 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
33f30 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
33f40 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
33f50 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
33f60 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
33f70 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
33f80 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
33f90 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
33fa0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
33fb0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67  (pPg);.  if( pag
33fc0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
33fd0 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  && !subjRequires
33fe0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
33ff0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
34000 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
34010 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
34020 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
34030 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
34040 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
34050 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
34060 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
34070 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
34080 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
34090 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
340a0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
340b0 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
340c0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
340d0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
340e0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
340f0 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49  /.    if( !pageI
34100 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
34110 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
34120 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61  ager) ){.      a
34130 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
34140 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
34150 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
34160 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
34170 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70  OrigSize && isOp
34180 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
34190 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  ){.        u32 c
341a0 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68  ksum;.        ch
341b0 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20  ar *pData2;.    
341c0 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70      i64 iOff = p
341d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
341e0 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  f;..        /* W
341f0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
34200 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
34210 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
34220 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
34230 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
34240 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
34250 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
34260 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
34270 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
34280 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
34290 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
342a0 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
342b0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
342c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
342d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
342e0 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Hdr<=pPager->jou
342f0 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20  rnalOff );.     
34300 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
34310 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
34320 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
34330 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
34340 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73  a2);.        cks
34350 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
34360 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
34370 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  ata2);..        
34380 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f  /* Even if an IO
34390 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72   or diskfull err
343a0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
343b0 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a  journalling the.
343c0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
343d0 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  in the block abo
343e0 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64  ve, set the need
343f0 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74  -sync flag for t
34400 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  he page..       
34410 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77   ** Otherwise, w
34420 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
34430 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
34440 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e  ck, the logic in
34450 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  .        ** play
34460 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
34470 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
34480 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
34490 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
344a0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
344b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
344c0 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  nd if an IO erro
344d0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
344e0 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20  oing so,.       
344f0 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
34500 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
34510 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34520 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
34530 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
34540 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
34550 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
34560 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70  er->jfd, iOff, p
34570 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
34580 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34590 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
345a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
345b0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
345c0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
345d0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
345e0 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20  ize, iOff+4);.  
345f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34600 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
34610 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20   rc;.        rc 
34620 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
34630 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b  ager->jfd, iOff+
34640 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34650 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  +4, cksum);.    
34660 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34670 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
34680 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52  c;..        IOTR
34690 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
346a0 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
346b0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
346c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
346d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
346e0 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  lOff, pPager->pa
346f0 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  geSize));.      
34700 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
34710 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
34720 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
34730 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a    PAGERTRACE(("J
34740 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
34750 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
34760 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
34770 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
34780 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
34790 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
347a0 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
347b0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
347c0 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
347d0 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
347e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
347f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20  journalOff += 8 
34800 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
34810 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  ze;.        pPag
34820 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
34830 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
34840 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
34850 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
34860 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
34870 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
34880 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
34890 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
348a0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
348b0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
348c0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
348d0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
348e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
348f0 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54        rc |= addT
34900 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
34910 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
34920 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
34930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
34950 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34960 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
34970 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
34990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
349a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
349b0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
349c0 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MOD ){.         
349d0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
349e0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
349f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34a00 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41    PAGERTRACE(("A
34a10 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
34a20 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
34a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34a40 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
34a50 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20  , pPg->pgno,.   
34a60 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
34a70 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
34a80 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29  EED_SYNC)?1:0)))
34a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34aa0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
34ab0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
34ac0 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
34ad0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
34ae0 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
34af0 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
34b00 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
34b10 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
34b20 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
34b30 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
34b40 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
34b50 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
34b60 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
34b70 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
34b80 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
34b90 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
34ba0 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
34bb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34bc0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
34bd0 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72  (pPg) ){.      r
34be0 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
34bf0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
34c00 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
34c10 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
34c20 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
34c30 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
34c40 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e  >dbSize<pPg->pgn
34c50 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
34c60 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
34c70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
34c80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
34c90 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
34ca0 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
34cb0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
34cc0 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
34cd0 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e   .** making chan
34ce0 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54  ges to a page. T
34cf0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
34d00 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
34d10 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69  value .** of thi
34d20 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62  s function and b
34d30 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
34d40 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
34d50 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a   data unless .**
34d60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
34d70 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
34d80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
34d90 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
34da0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
34db0 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
34dc0 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
34dd0 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
34de0 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
34df0 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
34e00 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
34e10 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
34e20 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
34e30 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
34e40 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
34e50 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
34e60 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
34e70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
34e80 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
34e90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
34ea0 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
34eb0 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
34ec0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
34ed0 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70  eturned.** as ap
34ee0 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72  propriate. Other
34ef0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
34f00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
34f10 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
34f20 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
34f30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34f40 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
34f50 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
34f60 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
34f70 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
34f80 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
34f90 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
34fa0 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
34fb0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65  geSize);..  asse
34fc0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
34fd0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
34fe0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
34ff0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35000 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
35010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
35020 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
35030 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
35040 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  f( nPagePerSecto
35050 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  r>1 ){.    Pgno 
35060 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  nPageCount;     
35070 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
35080 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
35090 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
350a0 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20  /.    Pgno pg1; 
350b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350c0 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
350d0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
350e0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a  is located on. *
350f0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
35100 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
35110 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
35120 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
35130 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
35140 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
35150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35160 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
35170 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  /.    int needSy
35180 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
35190 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p
351a0 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45  age has PGHDR_NE
351b0 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20  ED_SYNC */..    
351c0 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
351d0 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74  SyncSpill flag t
351e0 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
351f0 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
35200 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f  llow.    ** a jo
35210 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
35220 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
35230 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
35240 72 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a  rnaled by.    **
35250 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
35260 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
35270 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
35280 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35290 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d  >doNotSyncSpill=
352a0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
352b0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
352c0 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ++;..    /* This
352d0 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
352e0 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
352f0 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
35300 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
35310 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
35320 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
35330 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
35340 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
35350 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
35360 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
35370 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
35380 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
35390 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
353a0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
353b0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
353c0 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
353d0 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e  Count = pPager->
353e0 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  dbSize;.    if( 
353f0 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
35400 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
35410 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
35420 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d   - pg1)+1;.    }
35430 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50  else if( (pg1+nP
35440 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e  agePerSector-1)>
35450 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
35460 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
35470 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
35480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
35490 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
354a0 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
354b0 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
354c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31  ;.    assert(pg1
354d0 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
354e0 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
354f0 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
35500 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
35510 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d  ii<nPage && rc==
35520 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
35530 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20  {.      Pgno pg 
35540 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20  = pg1+ii;.      
35550 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20  PgHdr *pPage;.  
35560 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d      if( pg==pPg-
35570 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65  >pgno || !sqlite
35580 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
35590 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
355a0 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pg) ){.        i
355b0 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
355c0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
355d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
355e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
355f0 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
35600 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
35610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
35630 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
35640 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
35650 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
35660 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
35670 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
35680 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
35690 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
356a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
356b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
356c0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
356d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
356e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
356f0 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
35700 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29  kup(pPager, pg))
35710 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
35720 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
35730 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
35740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
35750 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
35760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
35770 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
35780 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
35790 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
357a0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
357b0 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20  YNC flag is set 
357c0 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e  for any of the n
357d0 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  Page pages .    
357e0 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
357f0 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64  g1, then it need
35800 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20  s to be set for 
35810 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63  all of them. Bec
35820 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  ause.    ** writ
35830 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  ing to any of th
35840 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  ese nPage pages 
35850 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f  may damage the o
35860 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a  thers, the.    *
35870 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * journal file m
35880 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63  ust contain sync
35890 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61  ()ed copies of a
358a0 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ll of them.    *
358b0 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20  * before any of 
358c0 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74  them can be writ
358d0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
358e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
358f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
35900 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65  =SQLITE_OK && ne
35910 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
35920 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
35930 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
35940 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b  ; ii<nPage; ii++
35950 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
35960 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   *pPage = pager_
35970 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
35980 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20  g1+ii);.        
35990 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
359a0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c         pPage->fl
359b0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
359c0 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
359d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
359e0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
359f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35a00 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
35a10 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
35a20 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20  ncSpill==1 );.  
35a30 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
35a40 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65  yncSpill--;.  }e
35a50 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
35a60 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
35a70 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
35a80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
35a90 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
35aa0 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
35ab0 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
35ac0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
35ad0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
35ae0 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
35af0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
35b00 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
35b10 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
35b20 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
35b30 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
35b40 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
35b50 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
35b60 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
35b70 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
35b80 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
35b90 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
35ba0 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
35bb0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
35bc0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
35bd0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
35be0 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
35bf0 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
35c00 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
35c10 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
35c20 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
35c30 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
35c40 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
35c50 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
35c60 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
35c70 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
35c80 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
35c90 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
35ca0 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
35cb0 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
35cc0 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
35cd0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
35ce0 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
35cf0 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
35d00 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
35d10 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
35d20 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
35d30 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
35d40 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
35d50 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
35d60 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
35d70 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
35d80 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
35d90 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
35da0 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
35db0 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75  ation can quadru
35dc0 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
35dd0 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54   large .** DELET
35de0 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  E operations..*/
35df0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
35e00 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64  erDontWrite(PgHd
35e10 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
35e20 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
35e30 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70  pPager;.  if( (p
35e40 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
35e50 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72  DIRTY) && pPager
35e60 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
35e70 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
35e80 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E(("DONT_WRITE p
35e90 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
35ea0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
35eb0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
35ec0 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
35ed0 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
35ee0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
35ef0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
35f00 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  |= PGHDR_DONT_WR
35f10 49 54 45 3b 0a 20 20 20 20 70 61 67 65 72 5f 73  ITE;.    pager_s
35f20 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
35f30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
35f40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
35f50 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
35f60 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nt the value of 
35f70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35f80 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75  e .** change-cou
35f90 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  nter, stored as 
35fa0 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 4-byte big-end
35fb0 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72  ian integer star
35fc0 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65  ting at .** byte
35fd0 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
35fe0 65 20 70 61 67 65 72 20 66 69 6c 65 2e 20 20 54  e pager file.  T
35ff0 68 65 20 73 65 63 6f 6e 64 61 72 79 20 63 68 61  he secondary cha
36000 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a  nge counter at.*
36010 2a 20 39 32 20 69 73 20 61 6c 73 6f 20 75 70 64  * 92 is also upd
36020 61 74 65 64 2c 20 61 73 20 69 73 20 74 68 65 20  ated, as is the 
36030 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
36040 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20  umber at offset 
36050 39 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68  96..**.** But th
36060 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
36070 69 66 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63  if the pPager->c
36080 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
36090 6c 61 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  lag is false..**
360a0 20 54 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73   To avoid excess
360b0 20 63 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67   churning of pag
360c0 65 20 31 2c 20 74 68 65 20 75 70 64 61 74 65 20  e 1, the update 
360d0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63  only happens onc
360e0 65 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  e..** See also t
360f0 68 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63  he pager_write_c
36100 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 72  hangecounter() r
36110 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73  outine that does
36120 20 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74   an .** uncondit
36130 69 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f 66 20  ional update of 
36140 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
36150 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ers..**.** If th
36160 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
36170 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  lag is zero, the
36180 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  n this is done b
36190 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71  y calling .** sq
361a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
361b0 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  ) on page 1, the
361c0 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  n modifying the 
361d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
361e0 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e  ** page data. In
361f0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66   this case the f
36200 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61  ile will be upda
36210 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72  ted when the cur
36220 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
36230 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
36240 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69  ..**.** The isDi
36250 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61  rectMode flag ma
36260 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65  y only be non-ze
36270 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72  ro if the librar
36280 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a  y was compiled.*
36290 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  * with the SQLIT
362a0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
362b0 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69  WRITE macro defi
362c0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
362d0 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63  e,.** if isDirec
362e0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
362f0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
36300 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64   file is updated
36310 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20   directly.** by 
36320 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74  writing an updat
36330 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  ed version of pa
36340 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c  ge 1 using a cal
36350 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c  l to the .** sql
36360 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75  ite3OsWrite() fu
36370 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
36380 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
36390 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
363a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
363b0 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b  t isDirectMode){
363c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
363d0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
363e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
363f0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
36400 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
36410 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36420 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
36430 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
36440 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
36450 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
36460 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20  ;..  /* Declare 
36470 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  and initialize c
36480 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
36490 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74  'isDirect'. If t
364a0 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77  he.  ** atomic-w
364b0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
364c0 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20  n is enabled in 
364d0 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e  this build, then
364e0 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69   isDirect.  ** i
364f0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
36500 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
36510 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63  d as the isDirec
36520 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a  tMode parameter.
36530 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e    ** to this fun
36540 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
36550 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73  , it is always s
36560 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  et to zero..  **
36570 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69  .  ** The idea i
36580 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74  s that if the at
36590 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
365a0 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  ization is not. 
365b0 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63   ** enabled at c
365c0 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
365d0 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d   compiler can om
365e0 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a  it the tests of.
365f0 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20    ** 'isDirect' 
36600 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61  below, as well a
36610 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c  s the block encl
36620 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  osed in the.  **
36630 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29   "if( isDirect )
36640 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a  " condition..  *
36650 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
36660 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
36670 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49  RITE.# define DI
36680 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73  RECT_MODE 0.  as
36690 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f  sert( isDirectMo
366a0 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  de==0 );.  UNUSE
366b0 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69  D_PARAMETER(isDi
366c0 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65  rectMode);.#else
366d0 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54  .# define DIRECT
366e0 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f  _MODE isDirectMo
366f0 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  de.#endif..  if(
36700 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65   !pPager->change
36710 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61  CountDone && pPa
36720 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
36730 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
36740 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
36750 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20     /* Reference 
36760 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  to page 1 */..  
36770 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
36780 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69  r->tempFile && i
36790 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
367a0 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  ) );..    /* Ope
367b0 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
367c0 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
367d0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
367e0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
367f0 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
36800 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
36810 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d  PgHdr==0 || rc==
36820 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
36830 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65    /* If page one
36840 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63   was fetched suc
36850 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74  cessfully, and t
36860 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36870 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  not.    ** opera
36880 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d  ting in direct-m
36890 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31  ode, make page 1
368a0 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e   writable.  When
368b0 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20   not in .    ** 
368c0 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67  direct mode, pag
368d0 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65  e 1 is always he
368e0 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20  ld in cache and 
368f0 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47  hence the PagerG
36900 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76  et().    ** abov
36910 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63  e is always succ
36920 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74  essful - hence t
36930 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d  he ALWAYS on rc=
36940 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20  =SQLITE_OK..    
36950 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45  */.    if( !DIRE
36960 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59  CT_MODE && ALWAY
36970 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  S(rc==SQLITE_OK)
36980 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
36990 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
369a0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a  (pPgHdr);.    }.
369b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
369c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
369d0 2f 2a 20 41 63 74 75 61 6c 6c 79 20 64 6f 20 74  /* Actually do t
369e0 68 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65  he update of the
369f0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
36a00 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 77  */.      pager_w
36a10 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
36a20 65 72 28 70 50 67 48 64 72 29 3b 0a 0a 20 20 20  er(pPgHdr);..   
36a30 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67     /* If running
36a40 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   in direct mode,
36a50 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   write the conte
36a60 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f  nts of page 1 to
36a70 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20   the file. */.  
36a80 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d      if( DIRECT_M
36a90 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ODE ){.        c
36aa0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b  onst void *zBuf;
36ab0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36ac0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
36ad0 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ize>0 );.       
36ae0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
36af0 70 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20 31  pPgHdr->pData, 1
36b00 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 6, rc=SQLITE_N
36b10 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20  OMEM, zBuf);.   
36b20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36b30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36b40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36b50 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
36b60 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
36b70 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
36b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36b90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36ba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
36bb0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
36bc0 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
36bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
36be0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61  lse{.        pPa
36bf0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
36c00 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
36c10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
36c20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65  Release the page
36c30 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20   reference. */. 
36c40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36c50 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
36c60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
36c70 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
36c80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
36c90 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20  o disk. This is 
36ca0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d  a no-op for in-m
36cb0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 0a  emory databases.
36cc0 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68  ** or pages with
36cd0 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
36ce0 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  c flag set..**.*
36cf0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
36d00 20 6f 72 20 69 66 20 63 61 6c 6c 65 64 20 6f 6e   or if called on
36d10 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69   a pager for whi
36d20 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ch it is a no-op
36d30 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
36d40 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
36d50 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
36d60 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
36d70 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
36d80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
36d90 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
36da0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
36db0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
36dc0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
36dd0 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
36de0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
36df0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
36e00 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
36e10 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
36e20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  );.  }else if( i
36e30 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
36e40 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
36e50 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 73   !MEMDB );.    s
36e60 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
36e70 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  rol(pPager->fd, 
36e80 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e  SQLITE_FCNTL_SYN
36e90 43 5f 4f 4d 49 54 54 45 44 2c 20 28 76 6f 69 64  C_OMITTED, (void
36ea0 20 2a 29 26 72 63 29 3b 0a 20 20 7d 0a 20 20 72   *)&rc);.  }.  r
36eb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
36ec0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
36ed0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
36ee0 6c 65 64 20 77 68 69 6c 65 20 61 20 77 72 69 74  led while a writ
36ef0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
36f00 20 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f   active in.** ro
36f10 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68 65 20 63  llback. If the c
36f20 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
36f30 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  WAL mode, this c
36f40 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  all is a no-op. 
36f50 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
36f60 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
36f70 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
36f80 79 20 68 61 76 65 20 61 6e 20 45 58 43 4c 55 53  y have an EXCLUS
36f90 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  IVE lock on .** 
36fa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36fb0 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  e, an attempt is
36fc0 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
36fd0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  one..**.** If th
36fe0 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
36ff0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
37000 20 6f 72 20 74 68 65 20 61 74 74 65 6d 70 74 20   or the attempt 
37010 74 6f 20 6f 62 74 61 69 6e 20 69 74 20 69 73 0a  to obtain it is.
37020 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  ** successful, o
37030 72 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  r the connection
37040 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
37050 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
37060 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
37070 77 69 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c  wise, either SQL
37080 49 54 45 5f 42 55 53 59 20 6f 72 20 61 6e 20 53  ITE_BUSY or an S
37090 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
370a0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
370b0 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  * returned..*/.i
370c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 45  nt sqlite3PagerE
370d0 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61 67  xclusiveLock(Pag
370e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
370f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37100 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
37110 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37120 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
37130 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  OD .       || pP
37140 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37150 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
37160 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
37170 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37180 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37190 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
371a0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
371b0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
371c0 69 66 28 20 30 3d 3d 70 61 67 65 72 55 73 65 57  if( 0==pagerUseW
371d0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
371e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
371f0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
37200 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
37210 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
37220 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
37230 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
37240 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
37250 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
37260 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
37270 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
37280 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
37290 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
372a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
372b0 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
372c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
372d0 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
372e0 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
372f0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
37300 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
37310 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
37320 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
37330 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
37340 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a  ne ensures that:
37350 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  .**.**   * The d
37360 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
37370 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75  nge-counter is u
37380 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74  pdated,.**   * t
37390 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
373a0 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65  nced (unless the
373b0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
373c0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
373d0 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20  ed),.**   * all 
373e0 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20  dirty pages are 
373f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
37400 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a  atabase file, .*
37410 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
37420 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  se file is trunc
37430 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65  ated (if require
37440 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74  d), and.**   * t
37450 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37460 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   synced. .**.** 
37470 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
37480 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  hat remains to c
37490 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
374a0 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61  ction is to fina
374b0 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65  lize .** (delete
374c0 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  , truncate or ze
374d0 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72  ro the first par
374e0 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61  t of) the journa
374f0 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64  l file (or .** d
37500 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
37510 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
37520 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
37530 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
37540 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
37550 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
37560 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
37570 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
37580 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
37590 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
375a0 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
375b0 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61   If the final pa
375c0 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63  rameter - noSync
375d0 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e   - is true, then
375e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
375f0 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20  le itself.** is 
37600 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20  not synced. The 
37610 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c  caller must call
37620 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
37630 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a  c() directly to.
37640 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  ** sync the data
37650 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
37660 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50   calling CommitP
37670 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c  haseTwo() to del
37680 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ete the.** journ
37690 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  al file in this 
376a0 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  case..*/.int sql
376b0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
376c0 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72  haseOne(.  Pager
376d0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
376e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
376f0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
37700 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
37710 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
37720 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
37730 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
37740 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  al name */.  int
37750 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20   noSync         
37760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37770 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65  True to omit the
37780 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62   xSync on the db
37790 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
377a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
377b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
377c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
377d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
377e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
377f0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
37800 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37810 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37820 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
37830 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37840 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37850 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
37860 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37870 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
37880 52 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  R.  );.  assert(
37890 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
378a0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
378b0 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20    /* If a prior 
378c0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
378d0 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f  report that erro
378e0 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66  r again. */.  if
378f0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
37900 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
37910 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
37920 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  e;..  PAGERTRACE
37930 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  (("DATABASE SYNC
37940 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
37950 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22  r=%s nSize=%d\n"
37960 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
37970 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
37980 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ter, pPager->dbS
37990 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ize));..  /* If 
379a0 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  no database chan
379b0 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  ges have been ma
379c0 64 65 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  de, return early
379d0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
379e0 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
379f0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
37a00 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
37a10 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  OK;..  if( MEMDB
37a20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
37a30 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
37a40 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
37a50 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
37a60 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
37a70 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  .    ** function
37a80 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
37a90 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
37aa0 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20  mostly a no-op. 
37ab0 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20   However, any.  
37ac0 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70    ** backup in p
37ad0 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f  rogress needs to
37ae0 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
37af0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
37b00 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
37b10 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
37b20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
37b30 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
37b40 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50  ager) ){.      P
37b50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71  gHdr *pList = sq
37b60 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
37b70 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
37b80 61 63 68 65 29 3b 0a 20 20 20 20 20 20 50 67 48  ache);.      PgH
37b90 64 72 20 2a 70 50 61 67 65 4f 6e 65 20 3d 20 30  dr *pPageOne = 0
37ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
37bb0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
37bc0 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 74 20  /* Must have at 
37bd0 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 20 66  least one page f
37be0 6f 72 20 74 68 65 20 57 41 4c 20 63 6f 6d 6d 69  or the WAL commi
37bf0 74 20 66 6c 61 67 2e 0a 20 20 20 20 20 20 20 20  t flag..        
37c00 2a 2a 20 54 69 63 6b 65 74 20 5b 32 64 31 61 35  ** Ticket [2d1a5
37c10 63 36 37 64 66 63 32 33 36 33 65 34 34 66 32 39  c67dfc2363e44f29
37c20 64 39 62 62 64 35 37 66 5d 20 32 30 31 31 2d 30  d9bbd57f] 2011-0
37c30 35 2d 31 38 20 2a 2f 0a 20 20 20 20 20 20 20 20  5-18 */.        
37c40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37c50 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
37c60 26 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20  &pPageOne);.    
37c70 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 67      pList = pPag
37c80 65 4f 6e 65 3b 0a 20 20 20 20 20 20 20 20 70 4c  eOne;.        pL
37c90 69 73 74 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ist->pDirty = 0;
37ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
37cb0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37cc0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
37cd0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
37ce0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
37cf0 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70  pagerWalFrames(p
37d00 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50  Pager, pList, pP
37d10 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c  ager->dbSize, 1,
37d20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
37d30 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
37d40 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  ? pPager->syncFl
37d50 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20 20  ags : 0).       
37d60 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
37d70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
37d80 72 65 66 28 70 50 61 67 65 4f 6e 65 29 3b 0a 20  ref(pPageOne);. 
37d90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
37da0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37db0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
37dc0 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
37dd0 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20  pPCache);.      
37de0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
37df0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
37e00 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65  ing block update
37e10 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  s the change-cou
37e20 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f  nter. Exactly ho
37e30 77 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f  w it.      ** do
37e40 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20  es this depends 
37e50 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
37e60 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  t the atomic-upd
37e70 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
37e80 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  .      ** was en
37e90 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
37ea0 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68   time, and if th
37eb0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  is transaction m
37ec0 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20  eets the .      
37ed0 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65  ** runtime crite
37ee0 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f  ria to use the o
37ef0 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20  peration: .     
37f00 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
37f10 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * The file-syste
37f20 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61  m supports the a
37f30 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
37f40 65 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  erty for.      *
37f50 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
37f60 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
37f70 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20   and .      **  
37f80 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20    * This commit 
37f90 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
37fa0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
37fb0 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
37fc0 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74     **    * Exact
37fd0 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
37fe0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
37ff0 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
38000 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
38010 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
38020 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
38030 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c  on was not enabl
38040 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
38050 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  me, then the.   
38060 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
38070 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
38080 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
38090 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  led to update th
380a0 65 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a  e change.      *
380b0 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e  * counter in 'in
380c0 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66  direct-mode'. If
380d0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
380e0 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e  n is compiled in
380f0 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73   but.      ** is
38100 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20   not applicable 
38110 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  to this transact
38120 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  ion, call sqlite
38130 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29  3JournalCreate()
38140 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  .      ** to mak
38150 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e  e sure the journ
38160 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75  al file has actu
38170 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65  ally been create
38180 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20  d, then call.   
38190 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
381a0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
381b0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
381c0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e  hange-counter in
381d0 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20   indirect.      
381e0 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20  ** mode. .      
381f0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  **.      ** Othe
38200 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70  rwise, if the op
38210 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f  timization is bo
38220 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61  th enabled and a
38230 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20  pplicable,.     
38240 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61   ** then call pa
38250 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
38260 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61  ounter() to upda
38270 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
38280 75 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  unter.      ** i
38290 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e  n 'direct' mode.
382a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
382b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
382c0 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20  ill never be.   
382d0 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f     ** created fo
382e0 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  r this transacti
382f0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23  on..      */.  #
38300 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
38310 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
38320 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
38330 67 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  g;.      assert(
38340 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
38350 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
38360 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
38370 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
38380 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
38390 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
383a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
383b0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
383c0 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
383d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
383e0 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28  aster && isOpen(
383f0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
38400 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
38410 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c  journalOff==jrnl
38420 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
38430 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  r) .       && pP
38440 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50  ager->dbSize>=pP
38450 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
38460 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28  .       && (0==(
38470 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61  pPg = sqlite3Pca
38480 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
38490 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c  ger->pPCache)) |
384a0 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79  | 0==pPg->pDirty
384b0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
384c0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
384d0 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
384e0 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20  counter via the 
384f0 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74  direct-write met
38500 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20  hod. The .      
38510 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63    ** following c
38520 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20  all will modify 
38530 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
38540 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
38550 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20  page 1 .        
38560 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ** to include th
38570 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65  e updated change
38580 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
38590 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a  n write page 1 .
385a0 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63          ** direc
385b0 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
385c0 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73  ase file. Becaus
385d0 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
385e0 77 72 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a  write .        *
385f0 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  * property of th
38600 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
38610 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65  em, this is safe
38620 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
38630 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
38640 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
38650 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
38660 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
38670 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38680 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
38690 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
386a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
386b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
386c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
386d0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
386e0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
386f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
38700 20 23 65 6c 73 65 0a 20 20 20 20 20