/ Hex Artifact Content
Login

Artifact 4092c907222cfd451c74fe6bd2fd64b342f7190f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  +.**            
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 65 64 2c 20 61 6c 6c 20 74 68 61  occured, all tha
3090: 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20  t remains is to 
30a0: 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
30b0: 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20  rnal to.**      
30c0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
30d0: 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72  action. If an er
30e0: 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74  ror did occur, t
30f0: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e  he caller will n
3100: 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72  eed.**      to r
3110: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
3120: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
3130: 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20   ERROR:.**.**   
3140: 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   The ERROR state
3150: 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e   is entered when
3160: 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66   an IO or disk-f
3170: 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75  ull error (inclu
3180: 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54  ding.**    SQLIT
3190: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f  E_IOERR_NOMEM) o
31a0: 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74  ccurs at a point
31b0: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61   in the code tha
31c0: 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20  t makes it .**  
31d0: 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62    difficult to b
31e0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
31f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
3200: 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e  state (cache con
3210: 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62  tents, .**    db
3220: 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20   size etc.) are 
3230: 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
3240: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3250: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
3260: 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72  .**.**    Tempor
3270: 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 20  ary pager files 
3280: 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45 52  may enter the ER
3290: 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 69  ROR state, but i
32a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a  n-memory pagers.
32b0: 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a  **    cannot..**
32c0: 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70  .**    For examp
32d0: 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72  le, if an IO err
32e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
32f0: 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c  performing a rol
3300: 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68  lback, .**    th
3310: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3320: 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79  e page-cache may
3330: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
3340: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74  nconsistent stat
3350: 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73  e..**    At this
3360: 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
3370: 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20  be dangerous to 
3380: 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52  change back to R
3390: 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20  EADER state.**  
33a0: 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61    (as usually ha
33b0: 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f  ppens after a ro
33c0: 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62  llback). Any sub
33d0: 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73 20  sequent readers 
33e0: 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f  might.**    repo
33f0: 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  rt database corr
3400: 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74  uption (due to t
3410: 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  he inconsistent 
3420: 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a  cache), and if.*
3430: 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61 64  *    they upgrad
3440: 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68  e to writers, th
3450: 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65  ey may inadverte
3460: 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  ntly corrupt the
3470: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
3480: 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74  file. To avoid t
3490: 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20  his hazard, the 
34a0: 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20 69  pager switches i
34b0: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
34c0: 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61  ate.**    instea
34d0: 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c  d of READER foll
34e0: 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72  owing such an er
34f0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e  ror..**.**    On
3500: 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72 65  ce it has entere
3510: 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
3520: 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74  e, any attempt t
3530: 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72 0a  o use the pager.
3540: 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72  **    to read or
3550: 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74 75   write data retu
3560: 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76  rns an error. Ev
3570: 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61  entually, once a
3580: 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61  ll .**    outsta
3590: 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  nding transactio
35a0: 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62 61  ns have been aba
35b0: 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65  ndoned, the page
35c0: 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  r is able to.** 
35d0: 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61     transition ba
35e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
35f0: 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68 65  , discarding the
3600: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
3610: 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63   .**    page-cac
3620: 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  he and any other
3630: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65   in-memory state
3640: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
3650: 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a  e. Everything.**
3660: 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20      is reloaded 
3670: 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20  from disk (and, 
3680: 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f  if necessary, ho
3690: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
36a0: 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20  ck peformed).** 
36b0: 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74     when a read-t
36c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65  ransaction is ne
36d0: 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  xt opened on the
36e0: 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74 69   pager (transiti
36f0: 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20  oning.**    the 
3700: 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45  pager into READE
3710: 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68 61  R state). At tha
3720: 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74  t point the syst
3730: 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65 64  em has recovered
3740: 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65   .**    from the
3750: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   error..**.**   
3760: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
3770: 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69  he pager jumps i
3780: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
3790: 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ate if:.**.**   
37a0: 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f     1. An error o
37b0: 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74 65  ccurs while atte
37c0: 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  mpting a rollbac
37d0: 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  k. This happens 
37e0: 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75  in.**         fu
37f0: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3800: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a  gerRollback()..*
3810: 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20  *.**      2. An 
3820: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
3830: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
3840: 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72   finalize a jour
3850: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
3860: 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20      following a 
3870: 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69  commit in functi
3880: 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  on sqlite3PagerC
3890: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e  ommitPhaseTwo().
38a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41  .**.**      3. A
38b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
38c0: 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20  hile attempting 
38d0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
38e0: 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20  journal or.**   
38f0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
3900: 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ile in function 
3910: 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
3920: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
3930: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d  p.**         mem
3940: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e  ory..**.**    In
3950: 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74 68   other cases, th
3960: 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  e error is retur
3970: 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65  ned to the b-tre
3980: 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74  e layer. The b-t
3990: 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20  ree.**    layer 
39a0: 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20  then attempts a 
39b0: 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
39c0: 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
39d0: 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20   condition .**  
39e0: 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65 20    persists, the 
39f0: 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
3a00: 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69 61   ERROR state via
3a10: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61   condition (1) a
3a20: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43  bove..**.**    C
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20  ondition (3) is 
3a40: 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
3a50: 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69 67  e it can be trig
3a60: 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64 2d  gered by a read-
3a70: 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65  only.**    state
3a80: 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77 69  ment executed wi
3a90: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
3aa0: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
3ab0: 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a  , if the error.*
3ac0: 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20 73  *    code were s
3ad0: 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74  imply returned t
3ae0: 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65 20  o the user, the 
3af0: 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75  b-tree layer wou
3b00: 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74  ld not.**    aut
3b10: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d  omatically attem
3b20: 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  pt a rollback, a
3b30: 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  s it assumes tha
3b40: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a  t an error in a.
3b50: 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20  **    read-only 
3b60: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74  statement cannot
3b70: 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65 72   leave the pager
3b80: 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c   in an internall
3b90: 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a  y inconsistent .
3ba0: 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a  **    state..**.
3bb0: 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67 65  **    * The Page
3bc0: 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
3bd0: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d  le is set to som
3be0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
3bf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
3c00: 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f     * There are o
3c10: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
3c20: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
3c30: 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74 65  s to pages (afte
3c40: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61  r the.**      la
3c50: 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  st reference is 
3c60: 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67 65  dropped the page
3c70: 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61  r should move ba
3c80: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
3c90: 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70  )..**    * The p
3ca0: 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69  ager is not an i
3cb0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
3cc0: 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  **    .**.** Not
3cd0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20  es:.**.**   * A 
3ce0: 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20 69  pager is never i
3cf0: 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f  n WRITER_DBMOD o
3d00: 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  r WRITER_FINISHE
3d10: 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a  D state if the.*
3d20: 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e  *     connection
3d30: 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20   is open in WAL 
3d40: 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e  mode. A WAL conn
3d50: 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ection is always
3d60: 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f   in one.**     o
3d70: 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75 72  f the first four
3d80: 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20   states..**.**  
3d90: 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63   * Normally, a c
3da0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69  onnection open i
3db0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
3dc0: 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47   is never in PAG
3dd0: 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73  ER_OPEN.**     s
3de0: 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65 20  tate. There are 
3df0: 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20  two exceptions: 
3e00: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
3e10: 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  r exclusive-mode
3e20: 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e   has.**     been
3e30: 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20   turned on (and 
3e40: 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20  before any read 
3e50: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
3e60: 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20  tions are .**   
3e70: 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64    executed), and
3e80: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
3e90: 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22  is leaving the "
3ea0: 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a  error state"..**
3eb0: 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f  .**   * See also
3ec0: 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  : assert_pager_s
3ed0: 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  tate()..*/.#defi
3ee0: 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20  ne PAGER_OPEN   
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3f00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
3f10: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
3f20: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50       1.#define P
3f30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
3f40: 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64 65  ED         2.#de
3f50: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3f60: 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20  R_CACHEMOD      
3f70: 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   3.#define PAGER
3f80: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
3f90: 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65         4.#define
3fa0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49   PAGER_WRITER_FI
3fb0: 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a 23  NISHED       5.#
3fc0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
3fd0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
3fe0: 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20     6../*.** The 
3ff0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
4000: 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61  able is almost a
4010: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65  lways set to one
4020: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
4030: 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74  owing locking-st
4040: 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20  ates, according 
4050: 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72  to the lock curr
4060: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a  ently held on.**
4070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4080: 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41  le: NO_LOCK, SHA
4090: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
40a0: 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55  ED_LOCK or EXCLU
40b0: 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68  SIVE_LOCK..** Th
40c0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b  is variable is k
40d0: 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20 61  ept up to date a
40e0: 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65  s locks are take
40f0: 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62  n and released b
4100: 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f  y.** the pagerLo
4110: 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65 72  ckDb() and pager
4120: 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70  UnlockDb() wrapp
4130: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ers..**.** If th
4140: 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72  e VFS xLock() or
4150: 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72   xUnlock() retur
4160: 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65  ns an error othe
4170: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
4180: 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20  SY.** (i.e. one 
4190: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
41a0: 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20 69  ERR subtypes), i
41b0: 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77  t is not clear w
41c0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
41d0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77   the operation w
41e0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49  as successful. I
41f0: 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73 74  n these circumst
4200: 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44  ances pagerLockD
4210: 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72  b() and.** pager
4220: 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20  UnlockDb() take 
4230: 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61  a conservative a
4240: 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20  pproach - eLock 
4250: 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74 65  is always update
4260: 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  d.** when unlock
4270: 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e  ing the file, an
4280: 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77  d only updated w
4290: 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  hen locking the 
42a0: 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56  file if the.** V
42b0: 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65  FS call is succe
42c0: 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c  ssful. This way,
42d0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
42e0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65   variable may be
42f0: 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73   set.** to a les
4300: 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77  s exclusive (low
4310: 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74  er) value than t
4320: 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20  he lock that is 
4330: 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a  actually held.**
4340: 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
4350: 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20  evel, but it is 
4360: 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d  never set to a m
4370: 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76 61  ore exclusive va
4380: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
4390: 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e  is usually safe.
43a0: 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66   If an xUnlock f
43b0: 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20  ails or appears 
43c0: 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d  to fail, there m
43d0: 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20  ay .** be a few 
43e0: 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28  redundant xLock(
43f0: 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63  ) calls or a loc
4400: 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f  k may be held fo
4410: 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a  r longer than.**
4420: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e   required, but n
4430: 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f  othing really go
4440: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4450: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
4460: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
4470: 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  se file is unloc
4480: 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65 72  ked as the pager
4490: 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45   moves.** from E
44a0: 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61  RROR to OPEN sta
44b0: 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  te. At this poin
44c0: 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  t there may be a
44d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
44e0: 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c  e .** in the fil
44f0: 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65  e-system that ne
4500: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
4510: 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f   back (as part o
4520: 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44  f a OPEN->SHARED
4530: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20  .** transition, 
4540: 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  by the same page
4550: 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e  r or any other).
4560: 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
4570: 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69  xUnlock().** fai
4580: 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ls at this point
4590: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
45a0: 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61  s left holding a
45b0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
45c0: 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f  , this.** can co
45d0: 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  nfuse the call t
45e0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
45f0: 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65  Lock() call made
4600: 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a   later as part.*
4610: 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  * of hot-journal
4620: 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a   detection..**.*
4630: 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
4640: 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65  Lock() is define
4650: 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74  d as returning t
4660: 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73  rue "if there is
4670: 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20   a RESERVED .** 
4680: 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69  lock held by thi
4690: 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79  s process or any
46a0: 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68   others". So xCh
46b0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
46c0: 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74  may .** return t
46d0: 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20  rue because the 
46e0: 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73  caller itself is
46f0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
4700: 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a  USIVE lock (but.
4710: 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20  ** doesn't know 
4720: 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  it because of a 
4730: 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69  previous error i
4740: 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74  n xUnlock). If t
4750: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61  his happens.** a
4760: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot-journal may
4770: 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72   be mistaken for
4780: 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67   a journal being
4790: 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61   created by an a
47a0: 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
47b0: 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  tion in another 
47c0: 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67  process, causing
47d0: 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20   SQLite to read 
47e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
47f0: 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c  e.** without rol
4800: 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  ling it back..**
4810: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
4820: 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61  nd this, if a ca
4830: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20  ll to xUnlock() 
4840: 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63  fails when unloc
4850: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61  king the.** data
4860: 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f  base in the ERRO
4870: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
4880: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
4890: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a  NKNOWN_LOCK. It.
48a0: 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67  ** is only chang
48b0: 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61  ed back to a rea
48c0: 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20  l locking state 
48d0: 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  after a successf
48e0: 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c  ul call.** to xL
48f0: 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20  ock(EXCLUSIVE). 
4900: 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74  Also, the code t
4910: 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53  o do the OPEN->S
4920: 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e  HARED state tran
4930: 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20  sition.** omits 
4940: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20  the check for a 
4950: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50  hot-journal if P
4960: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
4970: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4980: 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74  K .** lock. Inst
4990: 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20  ead, it assumes 
49a0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78  a hot-journal ex
49b0: 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73  ists and obtains
49c0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   an EXCLUSIVE.**
49d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
49e0: 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
49f0: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
4a00: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65  roll it back. Se
4a10: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61  e function.** Pa
4a20: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
4a30: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e  for more detail.
4a40: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  .**.** Pager.eLo
4a50: 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73  ck may only be s
4a60: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4a70: 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  CK when the page
4a80: 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45  r is in .** PAGE
4a90: 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f  R_OPEN state..*/
4aa0: 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e  .#define UNKNOWN
4ab0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20  _LOCK           
4ac0: 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f       (EXCLUSIVE_
4ad0: 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41  LOCK+1)../*.** A
4ae0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
4af0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
4b00: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
4b10: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
4b20: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
4b30: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
4b40: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
4b50: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
4b60: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
4b70: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
4b80: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
4b90: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
4ba0: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
4bb0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
4bc0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
4bd0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
4be0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
4bf0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
4c00: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
4c10: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
4c20: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
4c30: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
4c40: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4c50: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
4c60: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
4c70: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
4c80: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
4c90: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
4ca0: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
4cb0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
4cc0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
4cd0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
4ce0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4cf0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
4d00: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
4d10: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
4d20: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
4d30: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
4d40: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
4d50: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
4d60: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
4d70: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
4d80: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
4d90: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
4da0: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
4db0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4dc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4dd0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4de0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4df0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e00: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e10: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e20: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e30: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e40: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e50: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e60: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e70: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4e80: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4e90: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ea0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4eb0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ec0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ed0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4ee0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4ef0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f10: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f20: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f30: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f40: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f50: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f60: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f70: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4f80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4f90: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fa0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fb0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fc0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4fd0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
4fe0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
4ff0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5000: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5010: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5020: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5030: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5040: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5050: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5060: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5070: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5080: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50b0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50c0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50d0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
50e0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
50f0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5100: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5110: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5120: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5130: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5140: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5160: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5170: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
5180: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51b0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
51e0: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
51f0: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5200: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5210: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5220: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5230: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
5240: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
5250: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73  an instance of s
5260: 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64  truct Pager. A d
5270: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
5280: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72   some of the mor
5290: 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62  e important memb
52a0: 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c  er variables fol
52b0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61  lows:.**.** eSta
52c0: 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63  te.**.**   The c
52d0: 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f  urrent 'state' o
52e0: 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
52f0: 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ct. See the comm
5300: 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a  ent and state.**
5310: 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65     diagram above
5320: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
5330: 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  on of the pager 
5340: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f  state..**.** eLo
5350: 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61  ck.**.**   For a
5360: 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61   real on-disk da
5370: 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72  tabase, the curr
5380: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
5390: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
53a0: 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  le -.**   NO_LOC
53b0: 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
53c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
53d0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
53e0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74  .**.**   For a t
53f0: 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
5400: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28  emory database (
5410: 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
5420: 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20   require any.** 
5430: 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76    locks), this v
5440: 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79  ariable is alway
5450: 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49  s set to EXCLUSI
5460: 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73  VE_LOCK. Since s
5470: 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73  uch.**   databas
5480: 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50  es always have P
5490: 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f  ager.exclusiveMo
54a0: 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63  de==1, this tric
54b0: 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  ks the pager.** 
54c0: 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69    logic into thi
54d0: 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c  nking that it al
54e0: 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68  ready has all th
54f0: 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20  e locks it will 
5500: 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28  ever.**   need (
5510: 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f  and no reason to
5520: 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a   release them)..
5530: 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20  **.**   In some 
5540: 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d  (obscure) circum
5550: 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61  stances, this va
5560: 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20  riable may also 
5570: 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55  be set to.**   U
5580: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
5590: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
55a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
55b0: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
55c0: 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e  or.**   details.
55d0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
55e0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
55f0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
5600: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
5610: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
5620: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5630: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
5640: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
5650: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
5660: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
5670: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
5680: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
5690: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
56a0: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
56b0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
56c0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
56d0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
56e0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
56f0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
5700: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
5710: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
5720: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
5730: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
5740: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
5750: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
5760: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
5770: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
5780: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
5790: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
57a0: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
57b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
57c0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
57d0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
57e0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
57f0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
5800: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
5810: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
5820: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5830: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
5840: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
5850: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
5860: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
5870: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
5880: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
5890: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
58a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
58b0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
58c0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
58d0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
58e0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
58f0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
5900: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61  ted..**.** setMa
5910: 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  ster.**.**   Whe
5920: 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  n PagerCommitPha
5930: 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65  seOne() is calle
5940: 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72  d to commit a tr
5950: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
5960: 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e  y.**   (or may n
5970: 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61  ot) specify a ma
5980: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
5990: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
59a0: 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a  into the .**   j
59b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
59c0: 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  re it is synced 
59d0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20  to disk..**.**  
59e0: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
59f0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  a journal file c
5a00: 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72  ontains a master
5a10: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5a20: 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74   affects .**   t
5a30: 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20  he way in which 
5a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5a50: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66   is finalized af
5a60: 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
5a70: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d  ion is .**   com
5a80: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
5a90: 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69   back when runni
5aa0: 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ng in "journal_m
5ab0: 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64  ode=PERSIST" mod
5ac0: 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75  e..**   If a jou
5ad0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
5ae0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  ot contain a mas
5af0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b00: 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20  ter, it is.**   
5b10: 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65  finalized by ove
5b20: 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72  rwriting the fir
5b30: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
5b40: 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49  r with zeroes. I
5b50: 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63  f.**   it does c
5b60: 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d  ontain a master-
5b70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b90: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a   is finalized .*
5ba0: 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e  *   by truncatin
5bb0: 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74  g it to zero byt
5bc0: 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74  es, just as if t
5bd0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65  he connection we
5be0: 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67  re .**   running
5bf0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5c00: 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65  e=truncate" mode
5c10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61  ..**.**   Journa
5c20: 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e  l files that con
5c30: 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72  tain master jour
5c40: 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e  nal pointers can
5c50: 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64  not be finalized
5c60: 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20  .**   simply by 
5c70: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c80: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
5c90: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5ca0: 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61  , as the.**   ma
5cb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
5cc0: 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72  nter could inter
5cd0: 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f  fere with hot-jo
5ce0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
5cf0: 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65  f any.**   subse
5d00: 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70  quently interrup
5d10: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
5d20: 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20  that reuses the 
5d30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
5d40: 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69  .**   The flag i
5d50: 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f  s cleared as soo
5d60: 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n as the journal
5d70: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5d80: 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20  ed (either.**   
5d90: 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  by PagerCommitPh
5da0: 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52  aseTwo or PagerR
5db0: 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20  ollback). If an 
5dc0: 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74  IO error prevent
5dd0: 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s the.**   journ
5de0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
5df0: 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ng successfully 
5e00: 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73  finalized, the s
5e10: 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a  etMaster flag.**
5e20: 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e     is cleared an
5e30: 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61  yway (and the pa
5e40: 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f  ger will move to
5e50: 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a   ERROR state)..*
5e60: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c  *.** doNotSpill,
5e70: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a   doNotSyncSpill.
5e80: 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74 77  **.**   These tw
5e90: 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  o boolean variab
5ea0: 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20  les control the 
5eb0: 62 65 68 61 76 69 6f 75 72 20 6f 66 20 63 61 63  behaviour of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
7c70: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
7c80: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
7c90: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
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 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
7cf0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
7d00: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
7d10: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
7d20: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
7d30: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
7d40: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
7d50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7d60: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
7d70: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
7d80: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
7d90: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
7da0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
7db0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
7dc0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
7dd0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
7de0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
7df0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
7e00: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
7e10: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7e40: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
7e50: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e70: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
7e80: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
7e90: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
7ea0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
7eb0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
7ec0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
7ed0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
7ee0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
7ef0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
7f00: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7f10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7f20: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
7f30: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
7f40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
7f50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7f60: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
7f70: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
7f80: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
7f90: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
7fa0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
7fb0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
7fc0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
7fd0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
7fe0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
7ff0: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8000: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8010: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8020: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8030: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8040: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8060: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
8070: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
8080: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
8090: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
80a0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
80b0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
80c0: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
80d0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
80e0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
80f0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8100: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8110: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8120: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
8130: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
8140: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
8150: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
8160: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
8170: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
8180: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
8190: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
81a0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
81b0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
81c0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
81e0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
81f0: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8200: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8210: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8230: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
8240: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
8250: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
8260: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
8270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8280: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
8290: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
82a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
82b0: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
82c0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
82d0: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
82e0: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
82f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8300: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8310: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8320: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
8330: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
8340: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
8350: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20  ../*.** Indexes 
8360: 66 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67  for use with Pag
8370: 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20  er.aStat[]. The 
8380: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72  Pager.aStat[] ar
8390: 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ray contains.** 
83a0: 74 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73  the values acces
83b0: 73 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53  sed by passing S
83c0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
83d0: 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f  ACHE_HIT, CACHE_
83e0: 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48  MISS .** or CACH
83f0: 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74  E_WRITE to sqlit
8400: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a  e3_db_status()..
8410: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8420: 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64  _STAT_HIT   0.#d
8430: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
8440: 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65  _MISS  1.#define
8450: 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54   PAGER_STAT_WRIT
8460: 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  E 2../*.** The f
8470: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
8480: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
8490: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
84a0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
84b0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
84c0: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
84d0: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
84e0: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
84f0: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
8500: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
8510: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
8520: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
8530: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
8540: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
8550: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
8560: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
8570: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
8580: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8590: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
85a0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
85b0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
85c0: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
85d0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
85e0: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
85f0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8600: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
8610: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
8620: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8630: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
8640: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8650: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
8660: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
8670: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
8680: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
8690: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
86a0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
86b0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
86c0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
86d0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
86e0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
86f0: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
8700: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
8710: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
8720: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
8730: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
8740: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
8750: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
8760: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
8770: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
8780: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
8790: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
87a0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
87b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
87c0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
87d0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
87e0: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
87f0: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
8800: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
8810: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
8820: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
8830: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
8840: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
8850: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
8860: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
8870: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
8880: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
8890: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
88a0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
88b0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
88c0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
88d0: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
88e0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
88f0: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
8900: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
8910: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
8920: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
8930: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
8940: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
8950: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
8960: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
8970: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
8980: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
8990: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
89a0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
89b0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
89c0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
89d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
89e0: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
89f0: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
8a00: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
8a10: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
8a20: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
8a30: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
8a40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
8a50: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
8a60: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
8a70: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
8a80: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
8a90: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
8aa0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
8ab0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
8ac0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
8ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
8ae0: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
8af0: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
8b00: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
8b10: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
8b20: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
8b30: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
8b40: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
8b50: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
8b60: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
8b70: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
8b80: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8b90: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
8ba0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
8bb0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
8bc0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
8bd0: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
8be0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8bf0: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
8c00: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
8c10: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
8c20: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
8c30: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
8c40: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
8c50: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
8c60: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
8c70: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
8c80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
8c90: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
8ca0: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
8cb0: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
8cc0: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
8cd0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
8ce0: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
8cf0: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
8d00: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
8d10: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
8d20: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
8d30: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
8d40: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
8d50: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
8d60: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
8d70: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
8d80: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
8d90: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
8da0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
8db0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
8dc0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
8dd0: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
8de0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
8df0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
8e00: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
8e10: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
8e20: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
8e30: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
8e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8e50: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
8e60: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
8e70: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
8e80: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
8e90: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
8ea0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
8eb0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
8ec0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8ed0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
8ee0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
8ef0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
8f00: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
8f10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
8f20: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
8f30: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
8f40: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
8f50: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
8f60: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
8f70: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
8f80: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
8f90: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
8fa0: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
8fb0: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
8fc0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
8fd0: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
8fe0: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
8ff0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
9000: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
9010: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
9020: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
9030: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ods)../*.** Retu
9040: 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20  rn true if this 
9050: 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69  pager uses a wri
9060: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73  te-ahead log ins
9070: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
9080: 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  l.** rollback jo
9090: 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65  urnal. Otherwise
90a0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64   false..*/.#ifnd
90b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
90c0: 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  AL.static int pa
90d0: 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20  gerUseWal(Pager 
90e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
90f0: 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  rn (pPager->pWal
9100: 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  !=0);.}.#else.# 
9110: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9120: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9130: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
9140: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
9150: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
9160: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
9170: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
9180: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9190: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
91a0: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
91b0: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
91c0: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
91d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
91e0: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
91f0: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9200: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9210: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9220: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
9230: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
9240: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
9250: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
9260: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
9270: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
9280: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9290: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
92a0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
92b0: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
92c0: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
92d0: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
92e0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
92f0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9300: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
9310: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9320: 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
9330: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9340: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
9350: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
9360: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9370: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
9380: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9390: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
93a0: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
93b0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
93c0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
93d0: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
93e0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
93f0: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9400: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9410: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9420: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
9430: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
9440: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
9450: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
9460: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
9470: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9480: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9490: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
94a0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
94b0: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
94c0: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
94d0: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
94e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
94f0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9500: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9510: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9520: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9530: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
9540: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
9550: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
9560: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
9570: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
9580: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9590: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
95a0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
95b0: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
95c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
95d0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
95e0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
95f0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9600: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9610: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
9620: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
9630: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9640: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
9650: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
9660: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
9670: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
9680: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
9690: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
96a0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
96b0: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
96c0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
96d0: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
96e0: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
96f0: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
9700: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
9710: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
9720: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
9730: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
9740: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
9750: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
9760: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
9770: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
9780: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
9790: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
97a0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
97b0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
97c0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
97d0: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
97e0: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
97f0: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
9800: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
9810: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
9820: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
9830: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
9840: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
9850: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
9860: 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20   p->noSync );.  
9870: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9880: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9890: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
98a0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
98b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
98c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
98d0: 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20  EMORY .    );.  
98e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
98f0: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
9900: 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50   && p->eState!=P
9910: 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
9920: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
9930: 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20  eWal(p)==0 );.  
9940: 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67  }..  /* If chang
9950: 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65  eCountDone is se
9960: 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  t, a RESERVED lo
9970: 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
9980: 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20  st be held.  ** 
9990: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  on the file..  *
99a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
99b0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
99c0: 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  one==0 || pPager
99d0: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
99e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
99f0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45  rt( p->eLock!=PE
9a00: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  NDING_LOCK );.. 
9a10: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61   switch( p->eSta
9a20: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
9a30: 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20  AGER_OPEN:.     
9a40: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
9a50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9a60: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9a70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9a80: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9a90: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
9aa0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
9ab0: 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  he)==0 || pPager
9ac0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
9ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9ae0: 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45  case PAGER_READE
9af0: 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  R:.      assert(
9b00: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9b10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9b20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9b30: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
9b40: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
9b50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53  ert( p->eLock>=S
9b60: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
9b70: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9b80: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9b90: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
9ba0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9bb0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9bc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9bd0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
9be0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9bf0: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
9c00: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
9c10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9c20: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
9c30: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9c40: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9c50: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
9c60: 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
9c70: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9c80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9c90: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9ca0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9cb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9cc0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9cd0: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9ce0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9cf0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
9d00: 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Master==0 );.   
9d10: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
9d20: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
9d30: 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20  _CACHEMOD:.     
9d40: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9d50: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9d60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9d70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9d80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9d90: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
9da0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
9db0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69  .        /* It i
9dc0: 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
9dd0: 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
9de0: 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65  wal here that ne
9df0: 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20 20  ither the.      
9e00: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
9e10: 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69  e nor the WAL fi
9e20: 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69  le are open. Thi
9e30: 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67  s happens during
9e40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f  .        ** a ro
9e50: 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
9e60: 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65 73  on that switches
9e70: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   from journal_mo
9e80: 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a  de=off.        *
9e90: 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  * to journal_mod
9ea0: 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a  e=wal..        *
9eb0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
9ec0: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ( p->eLock>=RESE
9ed0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RVED_LOCK );.   
9ee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
9ef0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
9f00: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
9f10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9f20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9f30: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF .            
9f40: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9f50: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9f60: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
9f70: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
9f80: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9f90: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
9fa0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
9fb0: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
9fc0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
9fd0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
9fe0: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
9ff0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a000: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a010: 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61  R_DBMOD:.      a
a020: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a030: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a040: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a050: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a060: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a070: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a080: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a090: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a0a0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43  t( p->eLock>=EXC
a0b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a0c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a0d0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a0e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a0f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a100: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a110: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a120: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a130: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a140: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
a150: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a160: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a170: 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  <=pPager->dbHint
a180: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a190: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a1a0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a1b0: 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  SHED:.      asse
a1c0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a1d0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a1e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a1f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a200: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a210: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
a220: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a230: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a240: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a250: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a260: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a270: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a280: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a290: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a2a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a2b0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a2c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a2d0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a2e0: 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20  ERROR:.      /* 
a2f0: 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  There must be at
a300: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
a310: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
a320: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69 66   to the pager if
a330: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52  .      ** in ERR
a340: 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
a350: 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73 68  ise the pager sh
a360: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
a370: 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20  y dropped.      
a380: 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  ** back to OPEN 
a390: 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
a3a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a3b0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
a3c0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a3d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a3e0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
a3f0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a400: 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  >0 );.      brea
a410: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
a420: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
a430: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
a440: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a450: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
a460: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
a470: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
a480: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
a490: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
a4a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
a4b0: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
a4c0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
a4d0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
a4e0: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
a4f0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
a500: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
a510: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
a520: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
a530: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
a540: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
a550: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
a560: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
a570: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
a580: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
a590: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a5a0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
a5b0: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
a5c0: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
a5d0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
a5e0: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
a5f0: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
a600: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
a610: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
a620: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
a630: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
a640: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
a650: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
a660: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
a670: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
a680: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
a690: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
a6a0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
a6b0: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
a6c0: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
a6d0: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
a6e0: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
a6f0: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
a700: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
a710: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
a720: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
a730: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
a740: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
a750: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
a760: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
a770: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
a780: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
a790: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
a7a0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
a7b0: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
a7c0: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
a7d0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7e0: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
a7f0: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
a800: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
a810: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
a820: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
a830: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
a840: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
a850: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a860: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
a870: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
a880: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a890: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a8a0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
a8b0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
a8c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a8d0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
a8e0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
a8f0: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
a900: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
a910: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
a920: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
a930: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
a940: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
a950: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
a960: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
a970: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
a980: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
a990: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
a9a0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
a9b0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
a9c0: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
a9d0: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
a9e0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
a9f0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
aa00: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
aa10: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
aa20: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
aa30: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
aa40: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
aa50: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aa60: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aa70: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
aa80: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
aa90: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aaa0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aab0: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
aac0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
aad0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
aae0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
aaf0: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
ab00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ab10: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ab20: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
ab30: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
ab40: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
ab50: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ab60: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
ab70: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
ab80: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
ab90: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aba0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
abb0: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
abc0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
abd0: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
abe0: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
abf0: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
ac00: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
ac10: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
ac20: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
ac30: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
ac40: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
ac50: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
ac60: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
ac70: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
ac80: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t;.}.#endif../*.
ac90: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
aca0: 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  f it is necessar
acb0: 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20  y to write page 
acc0: 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75  *pPg into the su
acd0: 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20  b-journal..** A 
ace0: 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
acf0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ad00: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
ad10: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e   there exists on
ad20: 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65  e.** or more ope
ad30: 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72  n savepoints for
ad40: 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20   which:.**.**   
ad50: 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  * The page-numbe
ad60: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
ad70: 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72  r equal to Pager
ad80: 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c  Savepoint.nOrig,
ad90: 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
ada0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
adb0: 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75  g to the page-nu
adc0: 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20  mber is not set 
add0: 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  in.**     PagerS
ade0: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
adf0: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
ae00: 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65   int subjRequire
ae10: 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  sPage(PgHdr *pPg
ae20: 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  ){.  Pgno pgno =
ae30: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61   pPg->pgno;.  Pa
ae40: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ae50: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
ae60: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
ae70: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
ae80: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  int; i++){.    P
ae90: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
aea0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
aeb0: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
aec0: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
aed0: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
aee0: 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e  itvecTest(p->pIn
aef0: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
af00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
af10: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
af20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
af30: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
af40: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
af50: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
af60: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rnal file..*/.st
af70: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a  atic int pageInJ
af80: 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
af90: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
afa0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
afb0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Pg->pPager->pInJ
afc0: 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
afd0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  o);.}../*.** Rea
afe0: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
aff0: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
b000: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
b010: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
b020: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
b030: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
b040: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b050: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
b060: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
b070: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
b080: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
b090: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
b0a0: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
b0b0: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
b0c0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
b0d0: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
b0e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b0f0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b100: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
b110: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
b120: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
b130: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
b140: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
b150: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
b160: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b170: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
b180: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
b190: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b1a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
b1b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b1c0: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
b1d0: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
b1e0: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
b1f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
b200: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
b210: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
b220: 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  A,B).../*.** Wri
b230: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
b240: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
b250: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
b260: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
b270: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
b280: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
b290: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
b2a0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
b2b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
b2c0: 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  e32bits(sqlite3_
b2d0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b2e0: 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a  fset, u32 val){.
b2f0: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
b300: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
b310: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
b320: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
b330: 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ac, 4, offset);.
b340: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
b350: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b360: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
b370: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
b380: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a  either NO_LOCK.*
b390: 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  * or SHARED_LOCK
b3a0: 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
b3b0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b3c0: 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f  he call to xUnlo
b3d0: 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73  ck().** succeeds
b3e0: 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
b3f0: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b400: 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74  o match the (att
b410: 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b  empted) new lock
b420: 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
b430: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b440: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b450: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b460: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63  function is.** c
b470: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
b480: 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65  dify it. See the
b490: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b4a0: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a  he #define of .*
b4b0: 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  * UNKNOWN_LOCK f
b4c0: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
b4d0: 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  n of this..*/.st
b4e0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
b4f0: 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  lockDb(Pager *pP
b500: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
b510: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b520: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
b530: 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  t( !pPager->excl
b540: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
b550: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63  ger->eLock==eLoc
b560: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  k );.  assert( e
b570: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
b580: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b590: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
b5a0: 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20   eLock!=NO_LOCK 
b5b0: 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
b5c0: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69  Pager)==0 );.  i
b5d0: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
b5e0: 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
b5f0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
b600: 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck>=eLock );.   
b610: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55   rc = sqlite3OsU
b620: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
b630: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
b640: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21  ( pPager->eLock!
b650: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
b660: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b670: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
b690: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20  ACE(("UNLOCK %p 
b6a0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65  %d\n", pPager, e
b6b0: 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74  Lock)).  }.  ret
b6c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b6d0: 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   Lock the databa
b6e0: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
b6f0: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
b700: 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41  st be either SHA
b710: 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53  RED_LOCK,.** RES
b720: 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58  ERVED_LOCK or EX
b730: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66  CLUSIVE_LOCK. If
b740: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73   the caller is s
b750: 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
b760: 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  he.** Pager.eLoc
b770: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68  k variable to th
b780: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
b790: 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ate. .**.** Exce
b7a0: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
b7b0: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
b7c0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
b7d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b7e0: 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e  .** called, do n
b7f0: 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c  ot modify it unl
b800: 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b  ess the new lock
b810: 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43  ing state is EXC
b820: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a  LUSIVE_LOCK. .**
b830: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b840: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b850: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
b860: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
b870: 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69  ation .** of thi
b880: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b890: 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67   pagerLockDb(Pag
b8a0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
b8b0: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
b8c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
b8d0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
b8e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SHARED_LOCK || e
b8f0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
b900: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58  OCK || eLock==EX
b910: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
b920: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
b930: 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61  ock<eLock || pPa
b940: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
b950: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
b960: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
b970: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
b980: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
b990: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b9a0: 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d  (pPager->eLock!=
b9b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c  UNKNOWN_LOCK||eL
b9c0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
b9d0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50  OCK) ){.      pP
b9e0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
b9f0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49  8)eLock;.      I
ba00: 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
ba10: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
ba20: 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20  eLock)).    }.  
ba30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ba40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
ba50: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
ba60: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
ba70: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
ba80: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
ba90: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
baa0: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
bab0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
bac0: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
bad0: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
bae0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
baf0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
bb00: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
bb10: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
bb20: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
bb30: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
bb40: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
bb50: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
bb60: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
bb70: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
bb80: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
bb90: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
bba0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
bbb0: 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  ** The optimizat
bbc0: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61  ion is also alwa
bbd0: 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  ys enabled for t
bbe0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
bbf0: 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  It is.** an erro
bc00: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
bc10: 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65  unction if pPage
bc20: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r is opened on a
bc30: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
bc40: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
bc50: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
bc60: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
bc70: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
bc80: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
bc90: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
bca0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
bcb0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
bcc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bcd0: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
bce0: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
bcf0: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
bd00: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
bd10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
bd20: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
bd30: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
bd40: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
bd50: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
bd60: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
bd70: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
bd80: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63  le ){.    int dc
bd90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
bdb0: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
bdc0: 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74  stics */.    int
bdd0: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nSector;       
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bdf0: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
be00: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  .    int szPage;
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
be30: 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ize */..    asse
be40: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
be50: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63  r->fd) );.    dc
be60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
be70: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
be80: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
be90: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61     nSector = pPa
bea0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
beb0: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
bec0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
bed0: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
bee0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
bef0: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
bf00: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
bf10: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
bf20: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
bf30: 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53     if( 0==(dc&(S
bf40: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
bf50: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
bf60: 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67  || nSector>szPag
bf70: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
bf80: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
bf90: 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41  .  return JOURNA
bfa0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
bfb0: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
bfc0: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64  (pPager);.}.#end
bfd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  if../*.** If SQL
bfe0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
bff0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
c000: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
c010: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
c020: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
c030: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
c040: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
c050: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
c060: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
c070: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
c080: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c090: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
c0a0: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
c0b0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
c0c0: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
c0d0: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
c0e0: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
c0f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
c100: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
c110: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
c120: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
c130: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
c140: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
c150: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
c160: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
c170: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c180: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
c190: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
c1a0: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
c1b0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
c1c0: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
c1d0: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
c1e0: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
c1f0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
c200: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
c210: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
c220: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
c230: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c240: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
c250: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
c260: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
c270: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
c280: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
c290: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
c2a0: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
c2b0: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
c2c0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
c2d0: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
c2e0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
c2f0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
c300: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
c310: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
c320: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
c330: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c340: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
c350: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
c360: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
c370: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
c380: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
c390: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
c3a0: 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
c3b0: 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
c3c0: 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
c3d0: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
c3e0: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
c3f0: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
c400: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
c410: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
c420: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
c430: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
c440: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
c450: 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f  efine pager_set_
c460: 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65 66  pagehash(X).#def
c470: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
c480: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
c490: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c4a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
c4b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
c4c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c4d0: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
c4e0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
c4f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
c500: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
c510: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c520: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
c530: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
c540: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
c550: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
c560: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
c570: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
c580: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
c590: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
c5a0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
c5b0: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
c5c0: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
c5d0: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
c5e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c5f0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
c600: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
c610: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
c620: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
c630: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
c640: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
c650: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
c660: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
c670: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
c680: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
c690: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
c6a0: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
c6b0: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
c6c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c6d0: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
c6e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
c6f0: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
c700: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
c710: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
c720: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
c730: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
c740: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
c750: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
c760: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
c770: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
c780: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
c790: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
c7a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c7b0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c7c0: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
c7d0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
c7e0: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
c7f0: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
c800: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
c810: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
c820: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
c830: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
c840: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
c850: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
c860: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
c870: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
c880: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
c890: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
c8a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c8b0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c8c0: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
c8d0: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
c8e0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
c8f0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
c900: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c910: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
c920: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
c930: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
c940: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
c950: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c960: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
c970: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
c980: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
c990: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
c9a0: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
c9b0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
c9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c9d0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
c9e0: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
c9f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
ca00: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
ca10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
ca20: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
ca50: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
ca60: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
ca70: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
caa0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
cab0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
cac0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
cad0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
cae0: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
caf0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
cb00: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
cb10: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
cb20: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
cb30: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
cb40: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
cb50: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
cb60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
cb70: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
cb80: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
cb90: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
cba0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cbb0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cbc0: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
cbd0: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
cbe0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cbf0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cc00: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
cc10: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
cc20: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
cc30: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
cc40: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
cc50: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
cc60: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
cc70: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
cc80: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cc90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
cca0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
ccb0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
ccc0: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
ccd0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
cce0: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
ccf0: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
cd00: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cd10: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
cd20: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
cd30: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
cd40: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
cd50: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
cd60: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
cd70: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
cd80: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
cd90: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
cda0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
cdb0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cdc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cdd0: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
cde0: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
cdf0: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
ce00: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
ce10: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
ce20: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
ce30: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
ce40: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
ce50: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
ce60: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
ce70: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
ce80: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
ce90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ceb0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
cec0: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
ced0: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
cee0: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
cef0: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
cf00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cf10: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
cf20: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
cf30: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
cf40: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
cf50: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
cf60: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
cf70: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
cf80: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
cf90: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
cfa0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
cfd0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
cfe0: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
cff0: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
d000: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
d010: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d030: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
d060: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
d070: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
d080: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
d090: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
d0a0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
d0b0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
d0c0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
d0d0: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
d0e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d0f0: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
d100: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
d110: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
d120: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
d130: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
d140: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d150: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
d160: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
d170: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d180: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
d190: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
d1a0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d1b0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
d1c0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d1d0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
d1e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d1f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
d200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d210: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
d220: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
d230: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
d240: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
d250: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
d260: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
d270: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
d280: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
d290: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d2a0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
d2b0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
d2c0: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
d2d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
d2e0: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d2f0: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
d300: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
d310: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
d320: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d330: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
d340: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
d350: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
d360: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
d370: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
d380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
d390: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
d3a0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
d3b0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
d3c0: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
d3d0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
d3e0: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
d3f0: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
d400: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
d410: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
d420: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
d430: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
d440: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
d450: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
d460: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
d470: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
d480: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
d490: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
d4a0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
d4b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
d4c0: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
d4d0: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
d4e0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
d4f0: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
d500: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
d510: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
d520: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
d530: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
d540: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
d550: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
d560: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
d570: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
d580: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
d590: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
d5a0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
d5b0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
d5c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d5f0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
d600: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
d610: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
d620: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
d630: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
d640: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
d650: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
d660: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
d670: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d680: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
d690: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
d6a0: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
d6b0: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
d6c0: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
d6d0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
d6e0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
d6f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
d700: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d710: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
d720: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
d730: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
d740: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
d750: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
d760: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
d770: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
d780: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
d790: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
d7a0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
d7b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d7c0: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
d7d0: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
d7e0: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
d7f0: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
d800: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
d810: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
d820: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
d830: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
d840: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
d850: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
d860: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
d870: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
d880: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
d890: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
d8a0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
d8b0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
d8c0: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
d8d0: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
d8e0: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
d8f0: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
d900: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
d910: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
d920: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
d930: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
d940: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
d950: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
d960: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
d970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
d980: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
d990: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
d9a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
d9b0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
d9c0: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
d9d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d9e0: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
d9f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
da00: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
da10: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
da20: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
da30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
da40: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
da50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
da60: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
da70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
da80: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
da90: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
daa0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
dab0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
dac0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
dad0: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
dae0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
daf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
db00: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
db10: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
db20: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
db30: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
db40: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
db50: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
db60: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
db70: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
db80: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
db90: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
dba0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
dbb0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
dbc0: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
dbd0: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
dbe0: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
dbf0: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
dc00: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
dc10: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
dc20: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
dc30: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
dc40: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
dc50: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
dc60: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
dc70: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
dc80: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
dc90: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
dca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dcb0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
dcc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
dcd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dce0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
dcf0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dd00: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
dd10: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
dd20: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
dd30: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
dd40: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
dd50: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
dd60: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
dd70: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
dd80: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
dd90: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
dda0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
ddb0: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
dde0: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
ddf0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
de20: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
de30: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
de40: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
de50: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
de60: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
de70: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
de80: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
de90: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
dea0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
deb0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dec0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
ded0: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
dee0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
def0: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
df00: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
df10: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
df20: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
df30: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
df40: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
df50: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
df60: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
df70: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
df80: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
df90: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
dfa0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
dfb0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
dfc0: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
dfd0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
dfe0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
dff0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e000: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e010: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e020: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e030: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e040: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e050: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e060: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e070: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e080: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e090: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e0a0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e0b0: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e0c0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e0d0: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e0e0: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e0f0: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e100: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e110: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e120: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e130: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e140: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e150: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e160: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e170: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e180: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e190: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e1a0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e1b0: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e1c0: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e1d0: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e1e0: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e1f0: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e200: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e210: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e220: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e230: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e240: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e250: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e260: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e270: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e280: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
e290: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
e2a0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
e2b0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
e2c0: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
e2d0: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
e2e0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
e2f0: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
e300: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
e310: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
e320: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
e330: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
e340: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
e350: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e360: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
e370: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
e380: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
e390: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
e3a0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
e3b0: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
e3c0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e3d0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
e3e0: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
e3f0: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
e400: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
e410: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
e420: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
e430: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
e440: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e450: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e460: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
e470: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
e480: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
e490: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
e4a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e4b0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e4c0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
e4d0: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
e4e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
e4f0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
e500: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e510: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
e520: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
e530: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
e540: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e550: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
e560: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e570: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e580: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
e590: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
e5a0: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
e5b0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
e5c0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
e5d0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
e5e0: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
e5f0: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
e600: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
e610: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
e620: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
e630: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
e640: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
e650: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e660: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e670: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
e680: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
e690: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
e6a0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
e6b0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e6c0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e6d0: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
e6e0: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
e6f0: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
e700: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
e710: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
e720: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e730: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e740: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
e750: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
e760: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
e770: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
e780: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e790: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e7a0: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
e7b0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
e7c0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
e7d0: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
e7e0: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
e7f0: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
e800: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
e810: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
e820: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
e830: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
e840: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
e850: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
e860: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
e870: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
e880: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
e890: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
e8a0: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
e8b0: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
e8c0: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
e8d0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e8e0: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
e8f0: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
e900: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e910: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
e920: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
e930: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
e940: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
e950: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
e960: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e970: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
e980: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e990: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
e9a0: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
e9b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
e9c0: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
e9d0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
e9e0: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
e9f0: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
ea00: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
ea10: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
ea20: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
ea30: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
ea40: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
ea50: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
ea60: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
ea70: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
ea80: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
ea90: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
eaa0: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
eab0: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
eac0: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
ead0: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
eae0: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
eaf0: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
eb00: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
eb10: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
eb20: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
eb30: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
eb40: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
eb50: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
eb60: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
eb70: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
eb80: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
eb90: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
eba0: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
ebb0: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
ebc0: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
ebd0: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
ebe0: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
ebf0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
ec00: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
ec10: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
ec20: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
ec30: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
ec40: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
ec50: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
ec60: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
ec70: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
ec80: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
ec90: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
eca0: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
ecb0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
ecc0: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
ecd0: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
ece0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ecf0: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
ed00: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
ed10: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
ed20: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
ed30: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
ed40: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
ed50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ed60: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
ed70: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
ed80: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
ed90: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
eda0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
edb0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
edc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
edd0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ede0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
edf0: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
ee00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ee10: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
ee20: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
ee30: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
ee40: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
ee50: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
ee60: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
ee70: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
ee80: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
ee90: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
eea0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
eeb0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
eec0: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
eed0: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
eee0: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
eef0: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
ef00: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
ef10: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
ef20: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
ef30: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
ef40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
ef50: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
ef60: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
ef70: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
ef80: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
ef90: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
efa0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
efb0: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
efc0: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
efd0: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
efe0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
eff0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f000: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f010: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f020: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f030: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f040: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f050: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f060: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f070: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f080: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f090: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f0a0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f0b0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f0c0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f0d0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f0e0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f0f0: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f100: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f110: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f120: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f130: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f140: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f150: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f160: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f180: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f190: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f1b0: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f1c0: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f1d0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f1e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f1f0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f200: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f210: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f220: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f240: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f250: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f260: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f270: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f280: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f290: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
f2a0: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
f2b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f2e0: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
f2f0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
f300: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
f310: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
f320: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
f330: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f350: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
f360: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
f370: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
f380: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f390: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
f3a0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
f3b0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
f3c0: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
f3d0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
f3e0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f3f0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
f400: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
f410: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
f420: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
f430: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
f440: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
f450: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
f460: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
f470: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
f480: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
f490: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
f4a0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
f4b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
f4c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f4d0: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
f4e0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
f4f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f500: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
f510: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
f520: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
f530: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
f540: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f550: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
f560: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
f570: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
f580: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
f590: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
f5a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
f5b0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
f5c0: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
f5d0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
f5e0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f5f0: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
f600: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
f610: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
f620: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
f630: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
f640: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f650: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
f660: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
f670: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
f680: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
f690: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
f6a0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f6b0: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
f6c0: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
f6d0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
f6e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
f6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f710: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f720: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
f730: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
f740: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
f750: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
f760: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
f770: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
f780: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
f790: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
f7a0: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
f7b0: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
f7c0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
f7d0: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
f7e0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
f7f0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f800: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f810: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
f820: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
f830: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f840: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f850: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f860: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
f870: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
f880: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f890: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f8a0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f8b0: 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
f8c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
f8d0: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
f8e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f8f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
f900: 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
f910: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
f920: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
f930: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
f940: 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
f950: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
f960: 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
f970: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
f980: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
f990: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
f9a0: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
f9b0: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
f9c0: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
f9d0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
f9e0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f9f0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fa00: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
fa10: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
fa20: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fa30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fa40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fa50: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
fa60: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
fa70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fa80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
fa90: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
faa0: 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
fab0: 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
fac0: 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
fad0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
fae0: 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
faf0: 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
fb00: 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
fb10: 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
fb20: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
fb30: 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
fb40: 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
fb50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fb60: 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
fb70: 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
fb80: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
fb90: 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
fba0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
fbb0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
fbc0: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
fbd0: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
fbe0: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
fbf0: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
fc00: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
fc10: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
fc20: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
fc30: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
fc40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
fc50: 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
fc60: 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
fc70: 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
fc80: 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
fc90: 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
fca0: 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
fcb0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
fcc0: 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
fce0: 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
fcf0: 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
fd00: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
fd10: 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
fd20: 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
fd30: 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
fd40: 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
fd50: 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
fd60: 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
fd70: 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
fd80: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
fd90: 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
fda0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
fdb0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
fdc0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
fdd0: 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
fde0: 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
fdf0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
fe00: 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
fe10: 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
fe20: 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
fe30: 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
fe40: 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
fe50: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
fe60: 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
fe70: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
fe80: 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
fe90: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
fea0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
feb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
fec0: 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
fed0: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
fee0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
fef0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
ff00: 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
ff10: 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
ff20: 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
ff30: 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
ff40: 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
ff50: 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
ff60: 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
ff70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ff80: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
ff90: 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
ffa0: 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
ffb0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
ffc0: 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
ffd0: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
ffe0: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
fff0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10000 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10010 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10020 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
10030 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
10040 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
10050 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
10060 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
10070 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
10080 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10090 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
100a0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
100b0 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
100c0 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
100d0 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
100e0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
100f0 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10100 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10110 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10120 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
10130 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
10140 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
10150 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10160 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
10170 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
10180 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10190 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
101a0 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
101b0 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
101c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
101d0 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
101e0 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
101f0 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10200 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10210 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10220 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
10230 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
10240 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
10250 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
10260 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
10270 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
10280 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
10290 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
102a0 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
102b0 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
102c0 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
102d0 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
102e0 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
102f0 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10300 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10310 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10320 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
10330 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
10340 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
10350 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10360 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
10370 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
10380 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
10390 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
103a0 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
103b0 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
103c0 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
103d0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
103e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
103f0 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10400 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10410 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10420 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
10430 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
10440 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
10450 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
10460 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
10470 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
10480 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
10490 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
104a0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
104b0 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
104c0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
104d0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
104e0 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
104f0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10500 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10510 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10520 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10540 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10550 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
10580 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10590 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
105c0 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
105d0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
105e0 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10600 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10610 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10620 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
10630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10640 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
10650 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10660 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
10670 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10680 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
10690 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
106a0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
106b0 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
106c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
106d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
106e0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
106f0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
10700 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
10710 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
10720 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
10730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10740 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
10750 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
10760 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
10770 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73  r->jfd) );.  ass
10780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
10790 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
107a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
107b0 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
107c0 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62   the length in b
107d0 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65  ytes and the che
107e0 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72  cksum of zMaster
107f0 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65   */.  for(nMaste
10800 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  r=0; zMaster[nMa
10810 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b  ster]; nMaster++
10820 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
10830 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
10840 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
10850 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
10860 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
10870 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
10880 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
10890 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
108a0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
108b0 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
108c0 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
108d0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
108e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
108f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
10900 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
10910 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
10920 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
10930 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
10940 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
10950 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48  Pager);.  }.  iH
10960 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
10970 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
10980 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
10990 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20  er journal data 
109a0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
109b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
109c0 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  If.  ** an error
109d0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
109e0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
109f0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
10a00 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28  */.  if( (0 != (
10a10 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10a20 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10a30 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  drOff, PAGER_MJ_
10a40 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a  PGNO(pPager)))).
10a50 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10a60 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
10a70 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
10a80 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20  aster, nMaster, 
10a90 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20  iHdrOff+4))).   
10aa0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
10ab0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10ac0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10ad0 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  4+nMaster, nMast
10ae0 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  er))).   || (0 !
10af0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10b00 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10b10 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10b20 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20  er+4, cksum))). 
10b30 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10b40 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10b50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
10b60 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69  urnalMagic, 8, i
10b70 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10b80 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
10b90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10bb0 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
10bc0 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
10bd0 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
10be0 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
10bf0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
10c00 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
10c10 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
10c20 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
10c30 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
10c40 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
10c50 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
10c60 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
10c70 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
10c80 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
10c90 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
10ca0 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
10cb0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
10cc0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
10cd0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
10ce0 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
10cf0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
10d00 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
10d10 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
10d20 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
10d30 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
10d40 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
10d50 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
10d60 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
10d70 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
10d80 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
10d90 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
10da0 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
10db0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
10dc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10dd0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
10de0 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
10df0 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
10e00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
10e10 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
10e20 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
10e30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
10e40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
10e50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10e60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
10e70 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
10e80 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
10e90 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
10ea0 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
10eb0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
10ec0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
10ed0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
10ee0 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
10ef0 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
10f00 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
10f10 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
10f20 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
10f30 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
10f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10f60 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
10f70 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
10f80 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
10f90 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
10fa0 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
10fb0 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
10fc0 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
10fd0 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
10fe0 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
10ff0 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
11000 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
11010 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
11020 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
11030 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
11040 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
11050 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
11060 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11070 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11080 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11090 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
110a0 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
110b0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61  er){.  sqlite3Ba
110c0 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
110d0 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
110e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
110f0 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ar(pPager->pPCac
11100 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  he);.}../*.** Fr
11110 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11120 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11130 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11140 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
11150 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
11160 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
11170 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
11180 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
11190 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
111a0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
111b0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
111c0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
111d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
111e0 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
111f0 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11200 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11220 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11230 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11240 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
11250 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11260 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11270 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
11280 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
11290 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
112a0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
112b0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
112c0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
112d0 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
112e0 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
112f0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
11300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11310 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
11320 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
11330 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
11340 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
11350 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11360 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11370 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
11380 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
11390 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
113a0 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
113b0 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
113c0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
113d0 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
113e0 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
113f0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
11400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11410 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
11420 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
11430 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
11440 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
11450 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
11460 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
11470 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11480 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
11490 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
114a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
114b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
114c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
114d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
114e0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
114f0 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11500 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11510 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
11520 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
11530 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
11540 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
11550 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
11560 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
11570 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
11580 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
11590 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
115a0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
115b0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
115c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
115d0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
115e0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
115f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11610 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11620 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
11630 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11640 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a   mode and not.**
11650 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11660 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
11670 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65 20  it switches the 
11680 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f  pager to PAGER_O
11690 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a  PEN.** state..**
116a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
116b0 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
116c0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
116d0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
116e0 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65  ile is.** comple
116f0 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49  tely unlocked. I
11700 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
11710 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66  locked and the f
11720 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a  ile-system does.
11730 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74  ** not exhibit t
11740 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  he UNDELETABLE_W
11750 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74  HEN_OPEN propert
11760 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  y, the journal f
11770 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  ile is.** closed
11780 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29   (if it is open)
11790 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
117a0 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52  ager is in ERROR
117b0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
117c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
117d0 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  led, the .** con
117e0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
117f0 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69 73  er cache are dis
11800 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73 77  carded before sw
11810 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20  itching back to 
11820 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61  .** the OPEN sta
11830 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  te. Regardless o
11840 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61  f whether the pa
11850 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11860 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e  ive-mode.** or n
11870 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ot, any journal 
11880 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65  file left in the
11890 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c   file-system wil
118a0 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20  l be treated.** 
118b0 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
118c0 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
118d0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
118e0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
118f0 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28  n.** is opened (
11900 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e  by this or by an
11910 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  y other connecti
11920 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on)..*/.static v
11930 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
11940 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11950 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11960 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11970 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20 20  R_READER .      
11980 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
11990 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a  te==PAGER_OPEN .
119a0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
119b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
119c0 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73  ERROR .  );..  s
119d0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
119e0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
119f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
11a00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
11a10 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  0;.  releaseAllS
11a20 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
11a30 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
11a40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
11a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
11a60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11a70 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
11a80 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
11a90 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
11aa0 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
11ab0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
11ac0 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OPEN;.  }else if
11ad0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
11ae0 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
11af0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b10 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   Error code retu
11b20 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c  rned by pagerUnl
11b30 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69  ockDb() */.    i
11b40 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28  nt iDc = isOpen(
11b50 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69  pPager->fd)?sqli
11b60 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11b70 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
11b80 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f  r->fd):0;..    /
11b90 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
11ba0 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  ng system suppor
11bb0 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70  t deletion of op
11bc0 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20  en files, then. 
11bd0 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20     ** close the 
11be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
11bf0 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
11c00 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f  atabase lock.  O
11c10 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
11c20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
11c30 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
11c40 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
11c50 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  t delete the fil
11c60 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f  e.    ** out fro
11c70 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
11c80 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
11c90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11ca0 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21  E_MEMORY   & 5)!
11cb0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11cc0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11cd0 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20  MODE_OFF      & 
11ce0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11cf0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11d00 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
11d10 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11d20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11d30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
11d40 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  E   & 5)!=1 );. 
11d50 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11d60 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
11d70 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
11d80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11d90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11da0 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d  _PERSIST  & 5)==
11db0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  1 );.    if( 0==
11dc0 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
11dd0 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
11de0 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20  WHEN_OPEN).     
11df0 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a  || 1!=(pPager->j
11e00 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a  ournalMode & 5).
11e10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
11e20 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11e30 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
11e40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
11e50 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 45  ager is in the E
11e60 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
11e70 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63  he call to unloc
11e80 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  k the database. 
11e90 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73     ** file fails
11ea0 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e  , set the curren
11eb0 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57  t lock to UNKNOW
11ec0 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20  N_LOCK. See the 
11ed0 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61  comment.    ** a
11ee0 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
11ef0 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   for UNKNOWN_LOC
11f00 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
11f10 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73  tion of why this
11f20 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73  .    ** is neces
11f30 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
11f40 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63   rc = pagerUnloc
11f50 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  kDb(pPager, NO_L
11f60 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
11f70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
11f80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11f90 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20  AGER_ERROR ){.  
11fa0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
11fb0 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  k = UNKNOWN_LOCK
11fc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11fd0 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  The pager state 
11fe0 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20 66  may be changed f
11ff0 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20  rom PAGER_ERROR 
12000 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65  to PAGER_OPEN he
12010 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75  re.    ** withou
12020 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65  t clearing the e
12030 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20  rror code. This 
12040 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d  is intentional -
12050 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a   the error.    *
12060 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65  * code is cleare
12070 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
12080 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f  reset in the blo
12090 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  ck below..    */
120a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
120b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
120c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
120d0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
120e0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
120f0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12100 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12110 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61  .  }..  /* If Pa
12130 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
12140 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
12150 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
12160 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
12170 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
12180 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
12190 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
121a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
121b0 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63  pager,.  ** it c
121c0 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62  an safely move b
121d0 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ack to PAGER_OPE
121e0 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68 61  N state. This ha
121f0 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20  ppens in both.  
12200 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78  ** normal and ex
12210 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
12220 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mode..  */.  if(
12230 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12240 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12250 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
12260 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12270 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
12280 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12290 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
122a0 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e;.    pPager->e
122b0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
122c0 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  EN;.    pPager->
122d0 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
122e0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  _OK;.  }..  pPag
122f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
12300 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
12310 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
12320 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
12330 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
12340 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12350 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
12360 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
12370 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
12380 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
12390 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
123a0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
123b0 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
123c0 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
123d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
123e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
123f0 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
12400 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
12410 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
12420 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
12430 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
12440 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
12450 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
12460 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
12470 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
12480 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12490 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
124a0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
124b0 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
124c0 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
124d0 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
124e0 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
124f0 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
12500 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
12510 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12520 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
12530 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
12540 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
12550 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
12560 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
12570 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
12580 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
12590 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
125a0 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
125b0 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
125c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
125d0 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
125e0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
125f0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
12600 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
12610 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
12620 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
12630 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
12640 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
12650 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
12660 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
12670 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
12680 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
12690 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
126a0 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
126b0 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
126c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
126d0 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
126e0 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
126f0 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
12700 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
12710 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
12720 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
12730 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
12740 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12750 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
12760 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
12770 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
12780 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
12790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
127a0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
127b0 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
127c0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
127d0 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
127e0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
127f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
12800 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
12810 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
12820 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
12830 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
12840 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
12850 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
12860 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
12870 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
12880 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12890 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
128a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
128b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
128c0 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
128d0 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73  saction. A trans
128e0 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c  action is usuall
128f0 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65  y ended by .** e
12900 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f  ither a COMMIT o
12910 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  r a ROLLBACK ope
12920 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75  ration. This rou
12930 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c  tine may be call
12940 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c  ed .** after rol
12950 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a  lback of a hot-j
12960 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e  ournal, or if an
12970 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
12980 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74  ile opening.** t
12990 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
129a0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76  or writing the v
129b0 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  ery first journa
129c0 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a  l-header of a.**
129d0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
129e0 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ction..** .** Th
129f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
12a00 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41  ver called in PA
12a10 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
12a20 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64   If it is called
12a30 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e  .** in PAGER_NON
12a40 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45  E or PAGER_SHARE
12a50 44 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  D state and the 
12a60 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73  lock held is les
12a70 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74  s.** exclusive t
12a80 68 61 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  han a RESERVED l
12a90 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  ock, it is a no-
12aa0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  op..**.** Otherw
12ab0 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20  ise, any active 
12ac0 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72  savepoints are r
12ad0 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eleased..**.** I
12ae0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
12af0 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e  le is open, then
12b00 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65   it is "finalize
12b10 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e  d". Once a journ
12b20 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20  al .** file has 
12b30 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69  been finalized i
12b40 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
12b50 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72  e to use it to r
12b60 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74  oll back a .** t
12b70 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20  ransaction. Nor 
12b80 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69  will it be consi
12b90 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f  dered to be a ho
12ba0 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69  t-journal by thi
12bb0 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65  s.** or any othe
12bc0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
12bd0 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68  ction. Exactly h
12be0 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ow a journal is 
12bf0 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70  finalized.** dep
12c00 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
12c10 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72  or not the pager
12c20 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
12c30 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
12c40 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  d.** the current
12c50 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50   journal-mode (P
12c60 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
12c70 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c   value), as foll
12c80 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ows:.**.**   jou
12c90 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
12ca0 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
12cb0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12cc0 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64  is simply closed
12cd0 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20  . This destroys 
12ce0 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65  an .**     in-me
12cf0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  mory journal..**
12d00 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12d10 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20  e==TRUNCATE.**  
12d20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
12d30 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  is truncated to 
12d40 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
12d50 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ze..**.**   jour
12d60 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
12d70 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73  .**     The firs
12d80 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68  t 28 bytes of th
12d90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
12da0 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20  re zeroed. This 
12db0 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20  invalidates.**  
12dc0 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75     the first jou
12dd0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  rnal header in t
12de0 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e  he file, and hen
12df0 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  ce the entire jo
12e00 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
12e10 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f  e. An invalid jo
12e20 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f  urnal file canno
12e30 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
12e40 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
12e50 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a  lMode==DELETE.**
12e60 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
12e70 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20   file is closed 
12e80 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e  and deleted usin
12e90 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
12ea0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49  e()..**.**     I
12eb0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
12ec0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
12ed0 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d  ive mode, this m
12ee0 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a  ethod of finaliz
12ef0 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a  ing.**     the j
12f00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
12f10 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65  ever used. Inste
12f20 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ad, if the journ
12f30 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20  alMode is.**    
12f40 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
12f50 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
12f60 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
12f70 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
12f80 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f   under.**     jo
12f90 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
12fa0 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  ST is used inste
12fb0 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ad..**.** After 
12fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  the journal is f
12fd0 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61  inalized, the pa
12fe0 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47  ger moves to PAG
12ff0 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e  ER_READER state.
13000 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69  .** If running i
13010 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20  n non-exclusive 
13020 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74  rollback mode, t
13030 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  he lock on the f
13040 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67  ile is .** downg
13050 72 61 64 65 64 20 74 6f 20 61 20 53 48 41 52 45  raded to a SHARE
13060 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51  D_LOCK..**.** SQ
13070 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
13080 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
13090 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
130a0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
130b0 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20  g.** any of the 
130c0 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  IO operations to
130d0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
130e0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e  urnal file or un
130f0 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  lock the.** data
13100 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f  base then the IO
13110 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
13120 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
13130 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20  ser. If the .** 
13140 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e  operation to fin
13150 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13160 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68  l file fails, th
13170 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c  en the code stil
13180 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e  l.** tries to un
13190 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
131a0 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e  e file if not in
131b0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
131c0 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63   If the.** unloc
131d0 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  k operation fail
131e0 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20  s as well, then 
131f0 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13200 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20  code related.** 
13210 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72 72  to the first err
13220 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28  or encountered (
13230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  the journal fina
13240 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73  lization one) is
13250 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
13260 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13270 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
13280 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
13290 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b   int hasMaster){
132a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
132b0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
132c0 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
132d0 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
132e0 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
132f0 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13300 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13310 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13320 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
13330 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
13340 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
13350 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
13360 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
13370 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
13380 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
13390 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
133a0 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
133b0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
133c0 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
133d0 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
133e0 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
133f0 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13400 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13410 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13420 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
13430 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
13440 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
13450 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
13460 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
13470 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
13480 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
13490 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
134a0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
134b0 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
134c0 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
134d0 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
134e0 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
134f0 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13500 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13510 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13520 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
13530 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
13540 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
13550 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
13560 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
13570 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
13580 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
13590 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
135a0 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
135b0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
135c0 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
135d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
135e0 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
135f0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13600 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13610 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13620 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
13630 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
13640 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
13650 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
13660 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
13670 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
13680 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
13690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
136a0 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
136b0 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
136c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
136d0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
136e0 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
136f0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13700 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13710 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13720 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
13730 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
13740 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
13750 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
13760 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
13770 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
13780 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
13790 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
137a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
137b0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
137c0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
137d0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
137e0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
137f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13800 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13810 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13820 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13830 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13840 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13850 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
13860 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13880 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13890 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
138a0 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
138b0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
138c0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
138d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
138e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
138f0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13900 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13910 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13920 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13930 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13940 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13950 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
13960 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
13970 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
13980 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
13990 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
139a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
139b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
139c0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
139d0 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
139e0 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
139f0 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13a00 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13a10 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13a20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13a30 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13a40 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13a50 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
13a60 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13a70 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
13a80 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
13a90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
13aa0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
13ab0 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13ac0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13ad0 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13ae0 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74        int bDelet
13af0 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65  e = (!pPager->te
13b00 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65  mpFile && sqlite
13b10 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70  3JournalExists(p
13b20 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20  Pager->jfd));.  
13b30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13b40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13b50 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13b60 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13b70 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13b80 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13b90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13ba0 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13bb0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13bc0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13bd0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13be0 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13bf0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13c00 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13c10 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
13c20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13c30 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13c40 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13c50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13c60 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13c70 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13c80 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13c90 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13ca0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13cb0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13cc0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13cd0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13ce0 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13cf0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13d00 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13d10 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13d20 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c  Hdr *p = pager_l
13d30 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13d40 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13d50 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13d60 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13d70 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29  te3PagerUnref(p)
13d80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13d90 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
13da0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
13db0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
13dc0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
13dd0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
13de0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
13df0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
13e00 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
13e10 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
13e20 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
13e30 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
13e40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
13e50 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
13e60 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
13e70 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
13e80 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
13e90 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
13ea0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
13eb0 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
13ec0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
13ed0 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
13ee0 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
13ef0 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
13f00 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
13f10 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
13f20 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
13f30 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13f40 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
13f50 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
13f60 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
13f70 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
13f80 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   );.  }.  if( !p
13f90 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13fa0 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
13fb0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13fc0 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
13fd0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
13fe0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
13ff0 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
14000 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14010 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
14020 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
14030 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14040 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14050 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
14060 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
14070 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14080 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14090 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
140a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
140b0 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
140c0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
140d0 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
140e0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
140f0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
14100 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14110 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
14120 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
14130 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14140 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14150 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14160 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14170 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14180 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14190 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
141a0 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
141b0 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
141c0 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
141d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
141e0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
141f0 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
14200 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14210 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
14220 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
14230 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
14240 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
14250 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
14260 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
14270 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
14280 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
14290 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
142a0 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
142b0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
142c0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
142d0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
142e0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
142f0 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
14300 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
14310 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
14320 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
14330 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
14340 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
14350 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
14360 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
14370 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
14380 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14390 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
143a0 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
143b0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
143c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
143d0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
143e0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
143f0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
14400 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14410 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
14420 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14430 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
14440 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
14450 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
14460 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
14470 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
14480 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
144a0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
144b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
144c0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
144d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
144e0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
144f0 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
14500 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14510 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
14520 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14530 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
14540 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
14550 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
14560 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14570 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
14580 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
14590 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
145a0 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20  Parameter aData 
145b0 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
145c0 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72  buffer of pPager
145d0 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
145e0 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d  .** of data. Com
145f0 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
14600 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64  a checksum based
14610 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   ont the content
14620 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  s of the .** pag
14630 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68  e of data and th
14640 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
14650 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of pPager->cksum
14660 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Init..**.** This
14670 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
14680 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72  hecksum. It is r
14690 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
146a0 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
146b0 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
146c0 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  ue (pPager->cksu
146d0 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79  mInit) and every
146e0 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f   200th byte.** o
146f0 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c  f the page data,
14700 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62   starting with b
14710 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67  yte offset (pPag
14720 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30  er->pageSize%200
14730 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20  )..** Each byte 
14740 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
14750 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67  s an 8-bit unsig
14760 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  ned integer..**.
14770 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  ** Changing the 
14780 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20  formula used to 
14790 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65  compute this che
147a0 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e  cksum results in
147b0 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69   an.** incompati
147c0 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ble journal file
147d0 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
147e0 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  f journal corrup
147f0 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
14800 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
14810 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
14820 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f  ely .** scenario
14830 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
14840 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
14850 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
14860 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a   be changed. .**
14870 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73   It is much less
14880 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
14890 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
148a0 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
148b0 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
148c0 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
148d0 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
148e0 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
148f0 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
14900 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
14910 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
14920 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
14930 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
14940 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
14950 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
14960 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
14970 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
14980 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
14990 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
149a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ;         /* Che
149b0 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72  cksum value to r
149c0 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
149d0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
149e0 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20  ize-200;        
149f0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
14a00 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e  r */.  while( i>
14a10 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
14a20 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
14a30 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
14a40 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
14a50 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68  ./*.** Report th
14a60 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73  e current page s
14a70 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ize and number o
14a80 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
14a90 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20   back.** to the 
14aa0 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66  codec..*/.#ifdef
14ab0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
14ac0 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  C.static void pa
14ad0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61  gerReportSize(Pa
14ae0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14af0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
14b00 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20  ecSizeChng ){.  
14b10 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
14b20 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d  SizeChng(pPager-
14b30 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d  >pCodec, pPager-
14b40 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65        (int)pPage
14b70 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  r->nReserve);.  
14b80 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
14b90 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  ne pagerReportSi
14ba0 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d  ze(X)     /* No-
14bb0 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  op if we do not 
14bc0 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20  support a codec 
14bd0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
14be0 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
14bf0 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20  age from either 
14c00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14c10 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
14c20 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74  =1) or.** from t
14c30 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28  he sub-journal (
14c40 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30  if isMainJrnl==0
14c50 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74  ) and playback t
14c60 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65  hat page..** The
14c70 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20   page begins at 
14c80 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20  offset *pOffset 
14c90 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  into the file. T
14ca0 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  he *pOffset.** v
14cb0 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
14cc0 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
14cd0 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
14ce0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
14cf0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72  **.** The main r
14d00 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
14d10 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d  uses checksums -
14d20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
14d30 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20  ournal does .** 
14d40 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
14d50 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
14d60 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
14d70 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14d80 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14d90 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
14da0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
14db0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
14dc0 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
14dd0 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
14de0 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
14df0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
14e00 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
14e10 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
14e20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
14e30 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
14e40 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
14e50 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
14e60 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
14e70 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
14e80 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
14e90 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
14ea0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
14eb0 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
14ec0 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
14ed0 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
14ee0 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
14ef0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
14f00 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
14f10 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
14f20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
14f30 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
14f40 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
14f50 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
14f60 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
14f70 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
14f80 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
14f90 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
14fa0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
14fb0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
14fc0 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
14fd0 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
14fe0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
14ff0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
15000 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
15010 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15020 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
15030 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
15040 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
15050 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
15060 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
15070 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
15080 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
15090 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
150a0 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
150b0 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
150c0 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
150d0 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
150e0 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
150f0 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
15100 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
15110 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
15120 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
15130 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
15140 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
15150 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
15160 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
15170 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
15180 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
15190 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
151a0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
151b0 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
151c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
151d0 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
151e0 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
151f0 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
15200 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
15210 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
15220 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
15230 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
15240 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
15250 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
15260 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
15270 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
15280 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
15290 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
152a0 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
152b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
152c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
152d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
152e0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
152f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
15300 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15310 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
15320 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
15330 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
15340 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
15350 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
15360 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
15370 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
15380 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
15390 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
153a0 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
153b0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
153c0 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
153d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
153e0 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
153f0 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
15400 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
15410 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
15420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15430 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
15440 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
15450 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
15460 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
15470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15480 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
15490 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
154a0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
154d0 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
154e0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
154f0 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
15500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
15510 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
15520 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
15530 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
15540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15550 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
15560 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
15570 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
15580 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
15590 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
155a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
155b0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
155c0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
155d0 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
155e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
155f0 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
15600 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61  s synced */..  a
15610 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
15620 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
15630 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
15640 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
15650 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
15660 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
15670 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
15680 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15690 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
156a0 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
156b0 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
156c0 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
156d0 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
156e0 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
156f0 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
15700 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
15710 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
15720 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
15730 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
15740 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
15750 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
15760 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
15770 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
15780 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
15790 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  */.  assert( pag
157a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
157b0 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a  ==0 || (!isMainJ
157c0 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74  rnl && isSavepnt
157d0 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65  ) );..  /* Eithe
157e0 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67  r the state is g
157f0 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45  reater than PAGE
15800 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
15810 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  D (a transaction
15820 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f   .  ** or savepo
15830 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e  int rollback don
15840 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74  e at the request
15850 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20   of the caller) 
15860 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20  or this is.  ** 
15870 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15880 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73  llback. If it is
15890 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
158a0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67  ollback, the pag
158b0 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74  er.  ** is in st
158c0 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c  ate OPEN and hol
158d0 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ds an EXCLUSIVE 
158e0 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61  lock. Hot-journa
158f0 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  l rollback.  ** 
15900 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20  only reads from 
15910 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15920 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f  , not the sub-jo
15930 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
15940 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15950 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
15960 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
15970 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
15980 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
15990 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  N && pPager->eLo
159a0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
159b0 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  CK).  );.  asser
159c0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
159d0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
159e0 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61  CACHEMOD || isMa
159f0 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20  inJrnl );..  /* 
15a00 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
15a10 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61  mber and page da
15a20 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ta from the jour
15a30 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
15a40 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65  al.  ** file. Re
15a50 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
15a60 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
15a70 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
15a80 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a  occurs..  */.  j
15a90 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  fd = isMainJrnl 
15aa0 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
15ab0 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20  pPager->sjfd;.  
15ac0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
15ad0 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26  jfd, *pOffset, &
15ae0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
15af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
15b00 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
15b10 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
15b20 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
15b30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
15b40 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20  (*pOffset)+4);. 
15b50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15b60 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
15b70 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50    *pOffset += pP
15b80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
15b90 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a   4 + isMainJrnl*
15ba0 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
15bb0 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
15bc0 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
15bd0 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
15be0 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
15bf0 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
15c00 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
15c10 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
15c20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
15c30 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
15c40 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
15c50 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
15c60 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
15c70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
15c80 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
15c90 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
15ca0 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
15cb0 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
15cc0 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
15cd0 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
15ce0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
15cf0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
15d00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15d10 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20  !isSavepnt );.  
15d20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15d30 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
15d40 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
15d50 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
15d60 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
15d70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
15d80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15d90 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
15da0 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
15db0 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
15dc0 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29  (jfd, (*pOffset)
15dd0 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  -4, &cksum);.   
15de0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
15df0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73   rc;.    if( !is
15e00 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
15e10 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
15e20 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75  u8*)aData)!=cksu
15e30 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
15e40 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
15e50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
15e60 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20  f this page has 
15e70 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
15e80 79 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75  yed by before du
15e90 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
15ea0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20  .  ** rollback, 
15eb0 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65  then don't bothe
15ec0 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  r to play it bac
15ed0 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  k again..  */.  
15ee0 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
15ef0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
15f00 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
15f10 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
15f20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15f30 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c   }..  /* When pl
15f40 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20  aying back page 
15f50 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e  1, restore the n
15f60 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a  Reserve setting.
15f70 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
15f80 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  =1 && pPager->nR
15f90 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44  eserve!=((u8*)aD
15fa0 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20  ata)[20] ){.    
15fb0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15fc0 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b   = ((u8*)aData)[
15fd0 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65  20];.    pagerRe
15fe0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
15ff0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
16000 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43  he pager is in C
16010 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74  ACHEMOD state, t
16020 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
16030 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
16040 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
16050 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
16060 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
16070 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
16080 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
16090 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
160a0 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
160b0 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
160c0 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
160d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
160e0 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
160f0 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
16100 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
16110 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
16120 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
16130 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
16140 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
16150 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
16160 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
16170 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
16180 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
16190 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
161a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
161b0 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
161c0 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
161d0 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
161e0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
161f0 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
16200 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
16210 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
16220 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
16230 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
16240 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
16250 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54  .  ** If in WRIT
16260 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52  ER_DBMOD, WRITER
16270 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45  _FINISHED or OPE
16280 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  N state, then we
16290 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a   update the.  **
162a0 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
162b0 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68  it exists and th
162c0 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
162d0 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
162e0 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64  rked .  ** not d
162f0 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73  irty. Since this
16300 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78   code is only ex
16310 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f  ecuted in PAGER_
16320 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20  OPEN state for. 
16330 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
16340 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
16350 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
16360 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  t the page-cache
16370 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69   is empty.  ** i
16380 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16390 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  n OPEN state..  
163a0 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
163b0 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
163c0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
163d0 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
163e0 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
163f0 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
16400 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
16410 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
16420 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
16430 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
16440 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
16450 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
16460 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
16470 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
16480 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
16490 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
164a0 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
164b0 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
164c0 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
164d0 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
164e0 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
164f0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
16500 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
16510 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
16520 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
16530 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
16540 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
16550 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
16560 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
16570 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
16580 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
16590 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
165a0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
165b0 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
165c0 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
165d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
165e0 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
165f0 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
16600 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
16610 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
16620 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
16630 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
16640 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
16650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16660 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
16670 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
16680 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
16690 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
166a0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
166b0 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
166c0 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
166d0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
166e0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
166f0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
16700 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
16710 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
16720 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
16730 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
16740 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
16750 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
16760 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
16770 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
16780 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
16790 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
167a0 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
167b0 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
167c0 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
167d0 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
167e0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
167f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
16800 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
16810 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
16820 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16830 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  er) ){.    pPg =
16840 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
16850 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
16860 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
16870 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
16880 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
16890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
168a0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
168b0 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
168c0 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
168d0 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
168e0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
168f0 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
16900 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
16910 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
16920 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
16930 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
16940 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
16950 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
16960 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
16970 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
16980 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
16990 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
169a0 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
169b0 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
169c0 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
169d0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
169e0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
169f0 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
16a00 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
16a10 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
16a20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
16a30 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
16a40 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
16a50 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
16a60 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
16a70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
16a80 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
16a90 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
16aa0 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
16ab0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
16ac0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
16ad0 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
16ae0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
16af0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
16b00 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
16b10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16b20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
16b30 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
16b40 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
16b50 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a  pPager->fd, (u8*
16b60 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
16b70 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
16b80 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
16b90 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
16ba0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16bb0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
16bc0 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
16bd0 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
16be0 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
16bf0 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
16c00 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
16c10 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
16c20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
16c30 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
16c40 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
16c50 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
16c60 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
16c70 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
16c80 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
16c90 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
16ca0 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
16cb0 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
16cc0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
16cd0 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
16ce0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
16cf0 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
16d00 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
16d10 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
16d20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
16d30 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
16d40 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
16d50 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
16d60 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
16d70 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
16d80 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
16d90 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
16da0 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
16db0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
16dc0 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
16dd0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
16de0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
16df0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
16e00 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
16e10 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
16e20 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
16e30 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
16e40 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
16e50 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
16e60 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
16e70 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
16e80 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
16e90 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
16ea0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
16eb0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
16ec0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
16ed0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
16ee0 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
16ef0 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
16f00 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
16f10 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
16f20 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
16f30 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
16f40 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
16f50 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
16f60 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
16f70 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
16f80 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16f90 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
16fa0 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
16fb0 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
16fc0 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
16fd0 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
16fe0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
16ff0 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
17000 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
17010 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
17020 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
17030 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
17040 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
17050 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
17060 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
17070 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17080 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
17090 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
170a0 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
170b0 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
170c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
170d0 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
170e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
170f0 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
17100 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17110 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17120 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
17130 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
17140 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
17150 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
17160 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
17170 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
17180 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
17190 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
171a0 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
171b0 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
171c0 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
171d0 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
171e0 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
171f0 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
17200 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
17210 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
17220 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
17230 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
17240 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
17250 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
17260 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
17270 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
17280 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
17290 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
172a0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
172b0 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
172c0 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
172d0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
172e0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
172f0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
17300 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
17310 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
17320 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
17330 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
17340 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
17350 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
17360 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17370 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17380 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17390 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
173a0 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
173b0 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
173c0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
173d0 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
173e0 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
173f0 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
17400 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
17410 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
17420 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
17430 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
17440 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
17450 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
17460 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17470 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17480 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17490 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
174a0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
174b0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
174c0 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
174d0 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
174e0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
174f0 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
17500 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
17510 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
17520 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
17530 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
17540 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
17550 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
17560 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17570 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17580 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17590 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
175a0 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
175b0 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
175c0 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
175d0 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
175e0 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
175f0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
17600 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
17610 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
17620 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
17630 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17640 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17650 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17660 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17670 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17680 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17690 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
176a0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
176b0 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
176c0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
176d0 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
176e0 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
176f0 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
17700 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
17710 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
17720 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
17730 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17740 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17750 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17760 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17780 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17790 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
177a0 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
177b0 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
177c0 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
177d0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
177e0 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
177f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
17800 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
17810 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
17820 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17830 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17840 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17850 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17860 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17870 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17880 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17890 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
178a0 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
178b0 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
178c0 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
178d0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
178e0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
178f0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
17900 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
17910 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
17920 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17930 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
17940 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
17950 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
17960 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
17970 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
17980 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17990 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
179a0 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
179b0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
179c0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
179d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
179e0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
179f0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
17a00 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17a10 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
17a20 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
17a30 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
17a40 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17a50 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
17a60 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
17a70 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
17a80 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
17a90 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
17aa0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
17ab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
17ac0 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
17ad0 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
17ae0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
17af0 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
17b00 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
17b10 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
17b20 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
17b30 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
17b40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
17b50 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
17b60 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17b70 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
17b80 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
17b90 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
17ba0 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
17bb0 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
17bc0 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
17bd0 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
17be0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
17bf0 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
17c00 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
17c10 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
17c20 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
17c30 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
17c40 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
17c50 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
17c60 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
17c70 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
17c80 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
17c90 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
17ca0 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
17cb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
17cc0 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
17cd0 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
17ce0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
17cf0 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
17d00 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
17d10 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
17d20 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
17d30 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
17d40 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
17d50 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
17d60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17d70 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
17d80 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
17d90 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
17da0 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
17db0 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
17dc0 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
17dd0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
17de0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
17df0 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
17e00 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
17e10 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
17e20 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
17e30 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
17e40 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
17e50 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
17e60 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
17e70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
17e80 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
17e90 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
17ea0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
17eb0 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
17ec0 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
17ed0 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
17ee0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
17ef0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
17f00 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
17f10 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
17f20 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
17f30 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
17f40 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
17f50 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
17f60 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
17f70 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
17f80 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
17f90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
17fa0 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
17fb0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
17fc0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
17fd0 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
17fe0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
17ff0 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
18000 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
18010 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
18020 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
18030 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
18040 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
18050 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
18060 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
18070 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
18080 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18090 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
180a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
180b0 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
180c0 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
180d0 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
180e0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
180f0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18100 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
18110 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
18120 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
18130 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
18140 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
18150 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
18160 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
18170 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
18180 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18190 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
181a0 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
181b0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
181c0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
181d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
181e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
181f0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
18200 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
18210 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
18220 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
18230 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18240 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
18250 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
18260 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
18270 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18280 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
18290 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
182a0 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
182b0 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
182c0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
182d0 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
182e0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
182f0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
18300 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
18310 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
18320 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
18330 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
18340 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
18350 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
18360 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18370 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18380 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18390 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
183a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
183b0 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
183c0 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
183d0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
183e0 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
183f0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
18400 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
18410 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
18420 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
18430 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
18440 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
18450 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
18460 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18470 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18480 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18490 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
184a0 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
184b0 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
184c0 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
184d0 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
184e0 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
184f0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
18500 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
18510 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18520 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
18530 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
18540 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
18550 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
18560 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
18570 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
18580 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18590 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
185a0 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
185b0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
185c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
185d0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
185e0 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
185f0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
18600 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
18610 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
18620 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
18630 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18640 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
18650 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
18660 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
18670 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18680 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
18690 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
186a0 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
186b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
186c0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
186d0 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
186e0 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
186f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18700 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
18710 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
18720 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
18730 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18740 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18750 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
18760 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
18770 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
18780 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
18790 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
187a0 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
187b0 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
187c0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
187d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
187e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
187f0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18800 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
18810 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
18820 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
18830 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
18840 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
18850 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
18860 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
18870 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
18880 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18890 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
188a0 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
188b0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
188c0 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
188d0 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
188e0 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
188f0 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
18900 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
18910 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
18920 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
18930 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18940 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
18950 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
18960 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
18970 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
18980 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18990 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
189a0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
189b0 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
189c0 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
189d0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
189e0 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
189f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18a00 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
18a10 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
18a20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
18a30 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
18a40 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
18a50 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
18a60 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
18a70 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
18a80 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
18a90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
18aa0 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
18ab0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
18ac0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18ad0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
18ae0 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
18af0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18b00 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
18b10 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
18b20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18b30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18b40 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18b50 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18b60 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
18b70 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
18b80 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
18b90 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
18ba0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
18bb0 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
18bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18bd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18be0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18bf0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18c00 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
18c10 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
18c20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
18c30 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
18c40 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
18c50 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
18c60 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
18c70 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
18c80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18c90 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
18ca0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18cc0 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
18cd0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18ce0 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
18cf0 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
18d00 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
18d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
18d20 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
18d30 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
18d40 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
18d50 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
18d60 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
18d70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
18d80 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
18d90 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
18da0 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
18db0 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
18dc0 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
18dd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18de0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
18df0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
18e00 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
18e10 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
18e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
18e30 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
18e40 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
18e50 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
18e60 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
18e70 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
18e80 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
18e90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
18ea0 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
18eb0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
18ec0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
18ed0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
18ee0 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
18ef0 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
18f00 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
18f10 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
18f20 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
18f30 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
18f40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
18f50 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
18f60 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
18f70 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
18f80 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
18f90 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
18fa0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
18fb0 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
18fc0 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
18fd0 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
18fe0 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
18ff0 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
19000 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
19010 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
19020 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
19030 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
19040 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
19050 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
19060 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
19070 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
19080 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
19090 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
190a0 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
190b0 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
190c0 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
190d0 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
190e0 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
190f0 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
19100 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
19110 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
19120 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
19130 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
19140 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
19150 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
19160 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19170 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19180 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19190 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
191a0 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
191b0 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
191c0 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
191d0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
191e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
191f0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
19200 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19210 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
19220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19240 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
19250 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
19260 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19270 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19280 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19290 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
192a0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
192b0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
192c0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
192d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
192e0 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
192f0 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
19300 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
19310 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
19320 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
19330 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19340 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
19350 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
19360 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19370 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19380 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19390 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
193a0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
193b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
193c0 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
193d0 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
193e0 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
193f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19400 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
19410 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
19420 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
19430 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
19440 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19450 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
19460 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19470 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
19480 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
19490 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
194a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
194b0 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
194c0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
194d0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
194e0 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
194f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19500 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
19510 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
19520 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19530 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
19540 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
19550 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19560 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19570 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
19580 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
19590 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
195a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
195b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
195c0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
195d0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
195e0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
195f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19600 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19610 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64  turn a sanitized
19620 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
19630 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f  sector-size of O
19640 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68  S file pFile. Th
19650 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
19660 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
19670 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33  to lie between 3
19680 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52  2 and MAX_SECTOR
19690 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _SIZE..*/.int sq
196a0 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
196b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
196c0 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74  ile){.  int iRet
196d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
196e0 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20  orSize(pFile);. 
196f0 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a   if( iRet<32 ){.
19700 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a      iRet = 512;.
19710 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74    }else if( iRet
19720 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
19730 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19740 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
19750 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74  =512 );.    iRet
19760 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
19770 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
19780 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
19790 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
197a0 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
197b0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
197c0 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
197d0 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
197e0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
197f0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
19800 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
19810 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
19820 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
19830 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
19840 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
19850 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
19860 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
19870 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
19880 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
19890 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
198a0 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
198b0 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
198c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
198d0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
198e0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
198f0 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
19900 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
19910 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
19920 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
19930 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
19940 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
19950 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
19960 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
19970 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
19980 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
19990 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
199a0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
199b0 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
199c0 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
199d0 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
199e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
199f0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a  _SECTOR_SIZE..**
19a00 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19a10 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49  has the SQLITE_I
19a20 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
19a30 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74  VERWRITE propert
19a40 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74  y, then set.** t
19a50 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
19a60 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20  tor size to its 
19a70 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35  minimum value (5
19a80 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73  12).  The purpos
19a90 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  e of.** pPager->
19aa0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f  sectorSize is to
19ab0 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61   define the "bla
19ac0 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79  st radius" of by
19ad0 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  tes that.** migh
19ae0 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72  t change if a cr
19af0 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ash occurs while
19b00 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69   writing to a si
19b10 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20  ngle byte in.** 
19b20 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74  that range.  But
19b30 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f   with POWERSAFE_
19b40 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62  OVERWRITE, the b
19b50 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a  last radius is z
19b60 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20  ero.** (that is 
19b70 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f  what POWERSAFE_O
19b80 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c  VERWRITE means),
19b90 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20   so we minimize 
19ba0 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69  the sector.** si
19bb0 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72  ze.  For backwar
19bc0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
19bd0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
19be0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
19bf0 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e  rmat,.** we cann
19c00 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66  ot reduce the ef
19c10 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
19c20 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a  ize below 512..*
19c30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
19c40 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
19c50 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
19c60 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
19c70 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
19c80 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
19c90 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
19ca0 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73  empFile.   || (s
19cb0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
19cc0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
19cd0 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20  ager->fd) & .   
19ce0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
19cf0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
19d00 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a  E_OVERWRITE)!=0.
19d10 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74    ){.    /* Sect
19d20 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
19d30 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
19d40 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
19d50 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
19d60 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
19d70 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
19d80 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
19d90 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
19da0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
19db0 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20  l segfault. */. 
19dc0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
19dd0 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
19de0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
19df0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
19e00 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
19e10 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
19e20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
19e30 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
19e40 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
19e50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19e60 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
19e70 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
19e80 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
19e90 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
19ea0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
19eb0 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
19ec0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
19ed0 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
19ee0 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
19ef0 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
19f00 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
19f10 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
19f20 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
19f30 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19f40 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
19f50 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
19f60 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
19f70 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
19f80 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
19f90 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
19fa0 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
19fb0 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
19fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
19fd0 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
19fe0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
19ff0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a000 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
1a010 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
1a020 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
1a030 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
1a040 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
1a050 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a060 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
1a070 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
1a080 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
1a090 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
1a0a0 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
1a0b0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a0c0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a0d0 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
1a0e0 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
1a0f0 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
1a100 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1a110 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
1a120 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a130 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
1a140 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
1a150 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
1a160 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
1a170 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
1a180 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
1a190 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
1a1a0 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
1a1b0 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
1a1c0 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
1a1d0 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
1a1e0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1a1f0 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
1a200 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
1a210 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
1a220 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
1a230 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
1a240 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
1a250 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
1a260 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
1a270 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
1a280 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
1a290 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
1a2a0 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
1a2b0 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
1a2c0 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
1a2d0 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
1a2e0 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
1a2f0 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
1a300 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1a310 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
1a320 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
1a330 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1a340 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
1a350 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
1a360 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1a370 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
1a380 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
1a390 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
1a3a0 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1a3b0 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
1a3c0 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
1a3d0 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1a3e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a3f0 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1a400 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1a410 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1a420 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1a430 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1a440 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1a450 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1a460 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1a470 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1a480 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1a490 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1a4a0 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1a4b0 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1a4c0 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1a4d0 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1a4e0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1a4f0 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1a500 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1a510 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1a520 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1a530 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1a540 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1a550 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1a560 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1a570 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1a580 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1a590 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1a5a0 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1a5b0 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1a5c0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1a5d0 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1a5e0 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1a5f0 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1a600 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1a610 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1a620 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1a630 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1a640 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1a650 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1a660 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1a670 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1a680 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1a690 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1a6a0 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1a6b0 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1a6c0 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1a6d0 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1a6e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1a6f0 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1a700 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1a710 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1a720 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1a730 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1a740 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1a750 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1a760 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1a770 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1a780 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1a790 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1a7a0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1a7b0 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1a7c0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1a7d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1a7e0 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1a7f0 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1a800 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1a810 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1a820 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1a830 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1a840 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1a850 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1a860 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1a870 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1a880 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1a890 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1a8a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1a8b0 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1a8c0 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1a8d0 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1a8e0 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1a8f0 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1a900 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1a910 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1a920 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1a930 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1a940 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1a950 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1a960 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1a970 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1a980 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1a990 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1a9a0 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1a9b0 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1a9c0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1a9d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1a9e0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1a9f0 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1aa00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1aa10 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1aa20 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1aa30 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1aa40 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1aa50 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1aa60 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1aa70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1aa80 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1aa90 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1aaa0 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1aab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aac0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1aad0 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1aae0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1aaf0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1ab00 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1ab10 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1ab20 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1ab30 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1ab40 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ab50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1ab60 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1ab70 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1ab80 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1ab90 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1aba0 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1abb0 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a  ge rollback */..
1abc0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1abd0 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
1abe0 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
1abf0 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
1ac00 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
1ac10 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
1ac20 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
1ac30 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1ac40 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  d) );.  rc = sql
1ac50 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1ac60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
1ac70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1ac80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
1ac90 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1aca0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
1acb0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1acc0 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
1acd0 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
1ace0 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
1acf0 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1ad00 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
1ad10 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
1ad20 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
1ad30 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
1ad40 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
1ad50 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
1ad60 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
1ad70 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
1ad80 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
1ad90 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
1ada0 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
1adb0 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
1adc0 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
1add0 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
1ade0 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
1adf0 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
1ae00 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
1ae10 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
1ae20 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
1ae30 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
1ae40 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1ae50 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
1ae60 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
1ae70 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20    mxPathname is 
1ae80 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
1ae90 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
1aea0 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
1aeb0 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
1aec0 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
1aed0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1aee0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
1aef0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1af00 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1af10 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1af20 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1af30 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
1af40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1af50 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
1af60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1af70 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
1af80 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
1af90 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
1afa0 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
1afb0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
1afc0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
1afd0 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
1afe0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1aff0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b000 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
1b010 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
1b020 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
1b030 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
1b040 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
1b050 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
1b060 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
1b070 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
1b080 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
1b090 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
1b0a0 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
1b0b0 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
1b0c0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f  hile( 1 ){.    /
1b0d0 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
1b0e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
1b0f0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1b100 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
1b110 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
1b120 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
1b130 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1b140 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
1b150 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
1b160 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
1b170 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
1b180 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20  ocess must have 
1b190 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
1b1a0 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
1b1b0 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
1b1c0 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
1b1d0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1b1e0 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
1b1f0 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
1b200 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f  Hdr(pPager, isHo
1b210 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  t, szJ, &nRec, &
1b220 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
1b230 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
1b240 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1b250 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1b260 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b270 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1b280 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b290 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
1b2a0 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1b2b0 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1b2c0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
1b2d0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
1b2e0 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
1b2f0 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
1b300 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
1b310 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
1b320 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
1b330 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
1b340 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
1b350 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1b360 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
1b370 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
1b380 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1b390 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
1b3a0 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
1b3b0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1b3c0 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
1b3d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1b3e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1b3f0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1b400 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
1b410 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
1b420 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
1b430 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
1b440 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1b450 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1b460 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
1b470 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
1b480 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
1b490 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
1b4a0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
1b4b0 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
1b4c0 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
1b4d0 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
1b4e0 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
1b4f0 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
1b500 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
1b510 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1b520 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
1b530 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
1b540 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
1b550 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
1b560 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1b570 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
1b580 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
1b590 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1b5a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b5b0 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
1b5c0 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
1b5d0 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
1b5e0 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
1b5f0 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
1b600 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
1b610 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
1b620 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1b630 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
1b640 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
1b650 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
1b660 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
1b670 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
1b680 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
1b690 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
1b6a0 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
1b6b0 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
1b6c0 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
1b6d0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
1b6e0 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1b6f0 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
1b700 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
1b710 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
1b720 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
1b730 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1b740 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1b750 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
1b760 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
1b770 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
1b780 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
1b790 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
1b7a0 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
1b7b0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1b7c0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
1b7d0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1b7e0 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
1b7f0 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
1b800 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1b810 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
1b820 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
1b830 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1b840 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b850 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1b860 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
1b870 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1b880 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
1b890 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1b8a0 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
1b8b0 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
1b8c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1b8d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b8e0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1b8f0 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
1b900 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
1b910 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
1b920 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
1b930 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b940 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1b950 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1b960 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1b970 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
1b980 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1b990 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
1b9a0 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
1b9b0 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
1b9c0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
1b9d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1b9e0 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
1b9f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1ba00 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
1ba10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
1ba20 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
1ba30 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
1ba40 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1ba50 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
1ba60 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
1ba70 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1ba80 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
1ba90 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65  ge(pPager,&pPage
1baa0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
1bab0 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,0);.      if( 
1bac0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bad0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1bae0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1baf0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1bb00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
1bb10 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
1bb20 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1bb30 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1bb40 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1bb50 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1bb60 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
1bb70 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63  l has been trunc
1bb80 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f  ated, simply sto
1bb90 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20  p reading and.  
1bba0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1bbb0 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ssing the journa
1bbc0 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  l. This might ha
1bbd0 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72  ppen if the jour
1bbe0 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  nal was.        
1bbf0 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74    ** not complet
1bc00 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20  ely written and 
1bc10 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20  synced prior to 
1bc20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61  a crash.  In tha
1bc30 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1bc40 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ase, the databas
1bc50 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65  e should have ne
1bc60 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
1bc70 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1bc80 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65    ** first place
1bc90 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20   so it is OK to 
1bca0 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74  simply abandon t
1bcb0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a  he rollback. */.
1bcc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1bcd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1bce0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1bcf0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1bd00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1bd10 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  /* If we are una
1bd20 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
1bd30 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e   quit and return
1bd40 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   the error.     
1bd50 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54       ** code.  T
1bd60 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
1bd70 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
1bd80 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
1bd90 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
1bda0 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65  o that no furthe
1bdb0 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64  r harm will be d
1bdc0 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68  one.  Perhaps th
1bdd0 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20  e next.         
1bde0 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63   ** process to c
1bdf0 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62  ome along will b
1be00 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
1be10 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ck the database.
1be20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1be30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1be40 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1be50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1be60 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
1be70 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
1be80 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
1be90 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f  back:.  /* Follo
1bea0 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  wing a rollback,
1beb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bec0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63  le should be bac
1bed0 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61  k in its origina
1bee0 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69  l.  ** state pri
1bef0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
1bf00 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
1bf10 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68  on, so invoke th
1bf20 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43  e.  ** SQLITE_FC
1bf30 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1bf40 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65   file-control me
1bf50 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20  thod to disable 
1bf60 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69  the.  ** asserti
1bf70 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  on that the tran
1bf80 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1bf90 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20  was modified..  
1bfa0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1bfb0 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1bfc0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1bfd0 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
1bfe0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
1bff0 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  t(pPager->fd,SQL
1c000 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1c010 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23  HANGED,0);.  }.#
1c020 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1c030 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20  his playback is 
1c040 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61  happening automa
1c050 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73  tically as a res
1c060 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20  ult of an IO or 
1c070 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  .  ** malloc err
1c080 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  or that occurred
1c090 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
1c0a0 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  e-counter was up
1c0b0 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20  dated but .  ** 
1c0c0 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
1c0d0 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69  action was commi
1c0e0 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63  tted, then the c
1c0f0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20  hange-counter . 
1c100 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   ** modification
1c110 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62   may just have b
1c120 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66  een reverted. If
1c130 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   this happens in
1c140 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a   exclusive .  **
1c150 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73   mode, then subs
1c160 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69  equent transacti
1c170 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
1c180 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1c190 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70  will not.  ** up
1c1a0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
1c1b0 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20  counter at all. 
1c1c0 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f  This may lead to
1c1d0 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74   cache inconsist
1c1e0 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65  ency.  ** proble
1c1f0 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f  ms for other pro
1c200 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70  cesses at some p
1c210 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
1c220 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a  re. So, just.  *
1c230 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68  * in case this h
1c240 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65  as happened, cle
1c250 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  ar the changeCou
1c260 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e  ntDone flag now.
1c270 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1c280 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1c290 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
1c2a0 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  le;..  if( rc==S
1c2b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c2c0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1c2d0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
1c2e0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1c2f0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1c300 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1c310 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1c320 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74  thname+1);.    t
1c330 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1c340 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1c350 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c360 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  K.   && (pPager-
1c370 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1c380 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
1c390 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1c3a0 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a  AGER_OPEN).  ){.
1c3b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c3c0 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72  PagerSync(pPager
1c3d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c3e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c3f0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1c400 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1c410 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
1c420 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74  ='\0');.    test
1c430 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c440 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1c450 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c460 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
1c470 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
1c480 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
1c490 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
1c4a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1c4b0 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
1c4c0 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
1c4d0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1c4e0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
1c4f0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
1c500 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1c510 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
1c520 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1c530 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1c540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1c550 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
1c560 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1c570 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
1c580 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
1c590 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
1c5a0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
1c5b0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1c5c0 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
1c5d0 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
1c5e0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
1c5f0 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
1c600 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1c610 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
1c620 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
1c630 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1c640 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1c650 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1c660 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f  t for page pPg o
1c670 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
1c680 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f  se file and into
1c690 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e   .** pPg->pData.
1c6a0 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   A shared lock o
1c6b0 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
1c6c0 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
1c6d0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62  tabase.** file b
1c6e0 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
1c6f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1c700 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69  *.** If page 1 i
1c710 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65  s read, then the
1c720 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
1c730 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1c740 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61  set to.** the va
1c750 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
1c760 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c770 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
1c780 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1c790 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1c7a0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1c7b0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74  he caller..** Ot
1c7c0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1c7d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1c7e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1c7f0 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a  adDbPage(PgHdr *
1c800 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
1c810 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1c820 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
1c830 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1c840 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
1c850 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1c860 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20  Pg->pgno;       
1c870 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
1c880 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1c890 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1c8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1c8b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1c8c0 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20   isInWal = 0;   
1c8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c8e0 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e 20  e if page is in 
1c8f0 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  log file */.  in
1c900 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d  t pgsz = pPager-
1c910 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75  >pageSize; /* Nu
1c920 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1c930 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65   read */..  asse
1c940 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1c950 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
1c960 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
1c970 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1c980 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
1c990 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70   if( NEVER(!isOp
1c9a0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
1c9b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c9c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1c9d0 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
1c9e0 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
1c9f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1ca00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ca10 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
1ca20 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1ca30 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ger) ){.    /* T
1ca40 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1ca50 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1ca60 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1ca70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ca80 33 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d  3WalRead(pPager-
1ca90 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73  >pWal, pgno, &is
1caa0 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67  InWal, pgsz, pPg
1cab0 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  ->pData);.  }.  
1cac0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cad0 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b  K && !isInWal ){
1cae0 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1caf0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1cb00 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1cb10 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
1cb20 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1cb30 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1cb40 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1cb50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1cb60 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1cb70 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1cb80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cb90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1cba0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1cbb0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1cbc0 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1cbd0 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1cbe0 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1cbf0 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1cc00 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1cc10 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1cc20 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1cc30 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1cc40 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1cc50 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1cc60 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1cc70 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1cc80 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1cc90 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1cca0 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1ccb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1ccc0 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1ccd0 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1cce0 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1ccf0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1cd00 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1cd10 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1cd20 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1cd30 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1cd40 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1cd50 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1cd60 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1cd70 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1cd80 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1cd90 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1cda0 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1cdb0 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1cdc0 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1cdd0 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1cde0 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1cdf0 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1ce00 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1ce10 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61  ite noising equa
1ce20 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
1ce30 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
1ce40 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
1ce50 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
1ce60 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
1ce70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
1ce80 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
1ce90 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
1cea0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1ceb0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1cec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
1ced0 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
1cee0 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
1cef0 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
1cf00 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1cf10 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
1cf20 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
1cf30 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1cf40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
1cf50 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
1cf60 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
1cf70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1cf80 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
1cf90 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1cfa0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
1cfb0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1cfc0 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
1cfd0 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
1cfe0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1cff0 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
1d000 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
1d010 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
1d020 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1d030 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1d040 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
1d050 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
1d060 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1d070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1d080 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1d090 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d0a0 20 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61   at offsets 24 a
1d0b0 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20  nd 92 in.** the 
1d0c0 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73  header and the s
1d0d0 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  qlite version nu
1d0e0 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39  mber at offset 9
1d0f0 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  6..**.** This is
1d100 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   an unconditiona
1d110 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61  l update.  See a
1d120 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e  lso the pager_in
1d130 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1d140 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68  ().** routine wh
1d150 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73  ich only updates
1d160 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d170 74 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74  ter if the updat
1d180 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  e is actually.**
1d190 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65   needed, as dete
1d1a0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50  rmined by the pP
1d1b0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1d1c0 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69  tDone state vari
1d1d0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1d1e0 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65  void pager_write
1d1f0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1d200 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33  gHdr *pPg){.  u3
1d210 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1d220 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
1d230 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1d240 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1d250 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1d260 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f  24. */.  change_
1d270 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
1d280 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
1d290 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  Pg->pPager->dbFi
1d2a0 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74  leVers)+1;.  put
1d2b0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1d2c0 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  Pg->pData)+24, c
1d2d0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1d2e0 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65  .  /* Also store
1d2f0 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
1d300 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79  ion number in by
1d310 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69  tes 96..99 and i
1d320 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e  n.  ** bytes 92.
1d330 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68  .95 store the ch
1d340 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72  ange counter for
1d350 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69   which the versi
1d360 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69  on number.  ** i
1d370 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75  s valid. */.  pu
1d380 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1d390 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20  pPg->pData)+92, 
1d3a0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1d3b0 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1d3c0 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1d3d0 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
1d3e0 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a  ION_NUMBER);.}..
1d3f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d400 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
1d410 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1d420 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20  nvoked once for 
1d430 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68  each page that h
1d440 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1d450 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
1d460 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68   the log file wh
1d470 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  en a WAL transac
1d480 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1d490 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ack..** Paramete
1d4a0 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67  r iPg is the pag
1d4b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64  e number of said
1d4c0 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20   page. The pCtx 
1d4d0 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20  argument .** is 
1d4e0 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74  actually a point
1d4f0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
1d500 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
1d510 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20   If page iPg is 
1d520 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63  present in the c
1d530 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f  ache, and has no
1d540 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1d550 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69  erences,.** it i
1d560 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68  s discarded. Oth
1d570 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
1d580 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
1d590 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
1d5a0 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20  references, the 
1d5b0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
1d5c0 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  reloaded from th
1d5d0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
1d5e0 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  he.** attempt to
1d5f0 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20   reload content 
1d600 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d610 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e  e is required an
1d620 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74  d fails, .** ret
1d630 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
1d640 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
1d650 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
1d660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d670 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1d680 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f  void *pCtx, Pgno
1d690 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20   iPg){.  int rc 
1d6a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1d6b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1d6c0 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20  Pager *)pCtx;.  
1d6d0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70  PgHdr *pPg;..  p
1d6e0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
1d6f0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
1d700 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20  iPg);.  if( pPg 
1d710 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1d720 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
1d730 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a  ount(pPg)==1 ){.
1d740 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1d750 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
1d760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1d770 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1d780 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1d790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d7a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1d7b0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1d7c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1d7d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1d7e0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1d7f0 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  .  /* Normally, 
1d800 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1d810 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1d820 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63   any backup proc
1d830 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75  esses are.  ** u
1d840 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69  pdated as data i
1d850 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  s copied out of 
1d860 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1d870 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68  rnal and into th
1d880 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
1d890 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e   This is not gen
1d8a0 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  erally possible 
1d8b0 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62  with a WAL datab
1d8c0 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c  ase, as.  ** rol
1d8d0 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73  lback involves s
1d8e0 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67  imply truncating
1d8f0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54   the log file. T
1d900 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65  herefore, if one
1d910 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72  .  ** or more fr
1d920 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
1d930 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1d940 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74  o the log (and t
1d950 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61  herefore .  ** a
1d960 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  lso copied into 
1d970 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62  the backup datab
1d980 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66  ases) as part of
1d990 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1d9a0 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b  n,.  ** the back
1d9b0 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74  ups must be rest
1d9c0 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  arted..  */.  sq
1d9d0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
1d9e0 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
1d9f0 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  up);..  return r
1da00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1da10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1da20 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1da30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
1da40 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
1da50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1da60 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1da70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1da80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1dab0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1dac0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1dad0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1dae0 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1daf0 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20  revert */..  /* 
1db00 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  For all pages in
1db10 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1db20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69  are currently di
1db30 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65  rty or have alre
1db40 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72  ady.  ** been wr
1db50 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63  itten (but not c
1db60 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65  ommitted) to the
1db70 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e   log file, do on
1db80 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66  e of the .  ** f
1db90 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
1dba0 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20   **   + Discard 
1dbb0 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20  the cached page 
1dbc0 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29  (if refcount==0)
1dbd0 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65  , or.  **   + Re
1dbe0 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
1dbf0 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1dc00 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  ase (if refcount
1dc10 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  >0)..  */.  pPag
1dc20 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1dc30 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1dc40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1dc50 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  alUndo(pPager->p
1dc60 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61  Wal, pagerUndoCa
1dc70 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
1dc80 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74  pPager);.  pList
1dc90 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1dca0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1dcb0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68  ->pPCache);.  wh
1dcc0 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
1dcd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1dce0 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
1dcf0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1dd00 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
1dd10 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69  ndoCallback((voi
1dd20 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  d *)pPager, pLis
1dd30 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  t->pgno);.    pL
1dd40 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d  ist = pNext;.  }
1dd50 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1dd60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1dd70 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
1dd80 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
1dd90 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73  3WalFrames(). As
1dda0 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67   well as logging
1ddb0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
1ddc0 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   of the list of 
1ddd0 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20  pages headed by 
1dde0 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64  pList (connected
1ddf0 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20   by pDirty),.** 
1de00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  this function no
1de10 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76  tifies any activ
1de20 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  e backup process
1de30 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
1de40 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65  s have.** change
1de50 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69  d. .**.** The li
1de60 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73  st of pages pass
1de70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
1de80 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73  tine is always s
1de90 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75  orted by page nu
1dea0 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  mber..** Hence, 
1deb0 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72  if page 1 appear
1dec0 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  s anywhere on th
1ded0 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20  e list, it will 
1dee0 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  be the first pag
1def0 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  e..*/ .static in
1df00 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  t pagerWalFrames
1df10 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1df20 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1df30 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1df40 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ect */.  PgHdr *
1df50 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
1df60 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1df70 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f   of frames to lo
1df80 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75  g */.  Pgno nTru
1df90 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1dfa0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1dfb0 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  se size after th
1dfc0 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69  is commit */.  i
1dfd0 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dff0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1e000 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b  s a commit */.){
1e010 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e030 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e040 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74  e */.  int nList
1e050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e060 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e070 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69   of pages in pLi
1e080 73 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  st */.#if define
1e090 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1e0a0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1e0b0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29 0a 20  E_CHECK_PAGES). 
1e0c0 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0e0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1e0f0 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 23 65  over pages */.#e
1e100 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1e110 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a  pPager->pWal );.
1e120 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1e130 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1e140 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
1e150 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
1e160 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65   list is in acce
1e170 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
1e180 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20   for(p=pList; p 
1e190 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d  && p->pDirty; p=
1e1a0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1e1b0 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20  assert( p->pgno 
1e1c0 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e  < p->pDirty->pgn
1e1d0 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  o );.  }.#endif.
1e1e0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1e1f0 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69  ->pDirty==0 || i
1e200 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28  sCommit );.  if(
1e210 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20   isCommit ){.   
1e220 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61   /* If a WAL tra
1e230 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
1e240 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  g committed, the
1e250 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1e260 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a  n writing.    **
1e270 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20   any pages with 
1e280 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1e290 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63  ater than nTrunc
1e2a0 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c  ate into the WAL
1e2b0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68   file..    ** Th
1e2c0 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
1e2d0 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69   read by any cli
1e2e0 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74  ent. So remove t
1e2f0 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69  hem from the pDi
1e300 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  rty.    ** list 
1e310 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48  here. */.    PgH
1e320 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72  dr *p;.    PgHdr
1e330 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69   **ppNext = &pLi
1e340 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  st;.    nList = 
1e350 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  0;.    for(p=pLi
1e360 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70  st; (*ppNext = p
1e370 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74  )!=0; p=p->pDirt
1e380 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  y){.      if( p-
1e390 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65  >pgno<=nTruncate
1e3a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65   ){.        ppNe
1e3b0 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b  xt = &p->pDirty;
1e3c0 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b  .        nList++
1e3d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e3e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1e3f0 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1e400 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d    nList = 1;.  }
1e410 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74  .  pPager->aStat
1e420 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
1e430 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20  E] += nList;..  
1e440 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
1e450 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
1e460 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
1e470 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71  List);.  rc = sq
1e480 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
1e490 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
1e4a0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
1e4b0 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
1e4c0 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
1e4d0 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  , pPager->walSyn
1e4e0 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66  cFlags.  );.  if
1e4f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e500 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  && pPager->pBack
1e510 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  up ){.    PgHdr 
1e520 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c  *p;.    for(p=pL
1e530 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1e540 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rty){.      sqli
1e550 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1e560 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1e570 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29   p->pgno, (u8 *)
1e580 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  p->pData);.    }
1e590 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
1e5a0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1e5b0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1e5c0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1e5d0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1e5e0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  );.  for(p=pList
1e5f0 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1e600 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  ){.    pager_set
1e610 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20  _pagehash(p);.  
1e620 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1e630 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e640 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
1e650 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
1e660 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
1e670 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
1e680 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
1e690 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
1e6a0 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
1e6b0 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
1e6c0 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
1e6d0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
1e6e0 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
1e6f0 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
1e700 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
1e710 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
1e720 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
1e730 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
1e740 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
1e750 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
1e760 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
1e770 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1e780 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
1e790 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
1e7a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1e7b0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e7d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e7e0 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
1e7f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e800 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
1e810 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
1e820 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1e830 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1e840 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1e850 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1e860 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
1e870 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1e880 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20  GER_READER );.. 
1e890 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
1e8a0 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1e8b0 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
1e8c0 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
1e8d0 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
1e8e0 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
1e8f0 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
1e900 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
1e910 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
1e920 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1e930 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
1e940 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
1e950 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
1e960 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
1e970 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
1e980 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
1e990 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1e9a0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1e9b0 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
1e9c0 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
1e9d0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1e9e0 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
1e9f0 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
1ea00 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67  LITE_OK || chang
1ea10 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  ed ){.    pager_
1ea20 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1ea30 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1ea40 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1ea50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ea60 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
1ea70 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
1ea80 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50  on from PAGER_OP
1ea90 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52  EN.** to PAGER_R
1eaa0 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64  EADER state to d
1eab0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1eac0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ead0 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67  e file.** in pag
1eae0 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  es (assuming the
1eaf0 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65   page size curre
1eb00 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50  ntly stored in P
1eb10 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a  ager.pageSize)..
1eb20 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
1eb30 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
1eb40 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1eb50 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1eb60 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1eb70 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72  in pages is stor
1eb80 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f  ed in *pnPage. O
1eb90 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
1eba0 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73  or code (perhaps
1ebb0 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
1ebc0 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72  _FSTAT) is retur
1ebd0 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
1ebe0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
1ebf0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1ec00 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  t pagerPagecount
1ec10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1ec20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20  Pgno *pnPage){. 
1ec30 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1ec60 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1ec70 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74  */..  /* Query t
1ec80 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1ec90 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  m for the databa
1eca0 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c  se size. The Wal
1ecb0 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75  Dbsize().  ** fu
1ecc0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a  nction returns z
1ecd0 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69  ero if the WAL i
1ece0 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e  s not open (i.e.
1ecf0 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c   Pager.pWal==0),
1ed00 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20   or.  ** if the 
1ed10 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1ed20 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
1ed30 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1ed40 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76  e is not.  ** av
1ed50 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1ed60 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1ed70 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  if the log file 
1ed80 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a  is empty or.  **
1ed90 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c   contains no val
1eda0 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61  id committed tra
1edb0 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  nsactions..  */.
1edc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1edd0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1ede0 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1edf0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1ee00 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1ee10 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
1ee20 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
1ee30 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
1ee40 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1ee50 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61  size was not ava
1ee60 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1ee70 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a  WAL sub-system,.
1ee80 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69    ** determine i
1ee90 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
1eea0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1eeb0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
1eec0 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68   size.  ** of th
1eed0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1eee0 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
1eef0 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
1ef00 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a  e page-size,.  *
1ef10 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20  * round down to 
1ef20 74 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65  the nearest page
1ef30 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69  . Except, any fi
1ef40 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30  le larger than 0
1ef50 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
1ef60 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
1ef70 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20  d to contain at 
1ef80 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a  least one page..
1ef90 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1efa0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  ==0 ){.    i64 n
1efb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1efc0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1efd0 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62   of db file in b
1efe0 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  ytes */.    asse
1eff0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1f000 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1f010 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1f020 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1f030 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1f040 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1f050 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1f060 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
1f070 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f090 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f0a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50    }.    }.    nP
1f0b0 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b  age = (Pgno)((n+
1f0c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f0d0 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  -1) / pPager->pa
1f0e0 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
1f0f0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1f100 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1f110 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1f120 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1f130 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
1f140 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
1f150 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
1f160 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
1f170 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
1f180 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
1f190 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
1f1a0 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
1f1b0 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
1f1c0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
1f1d0 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
1f1e0 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1f1f0 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1f200 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1f210 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1f220 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  L./*.** Check if
1f230 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1f240 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1f250 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1f260 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
1f270 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
1f280 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1f290 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
1f2a0 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
1f2b0 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
1f2c0 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
1f2d0 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
1f2e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1f2f0 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
1f300 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1f310 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
1f320 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
1f330 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
1f340 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
1f350 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
1f360 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
1f370 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
1f380 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
1f390 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
1f3a0 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
1f3b0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
1f3c0 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
1f3d0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
1f3e0 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
1f3f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1f400 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1f410 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
1f420 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
1f430 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
1f440 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f450 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
1f460 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
1f470 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
1f480 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
1f490 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
1f4a0 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
1f4b0 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
1f4c0 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
1f4d0 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
1f4e0 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
1f4f0 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
1f500 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
1f510 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
1f520 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
1f530 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
1f540 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
1f550 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1f560 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
1f570 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
1f580 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f590 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f5a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f5b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1f5c0 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
1f5d0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
1f5e0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
1f5f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
1f600 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
1f610 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20  t isWal;        
1f620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f630 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20  rue if WAL file 
1f640 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67  exists */.    Pg
1f650 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1f660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1f670 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f680 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
1f690 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
1f6a0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1f6b0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f6c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f6d0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1f6e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1f6f0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
1f700 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
1f710 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20  r->zWal, 0);.   
1f720 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f730 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
1f740 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49  OENT ) rc = SQLI
1f750 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57  TE_OK;.      isW
1f760 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
1f770 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1f780 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
1f790 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1f7a0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
1f7b0 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
1f7c0 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
1f7d0 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
1f7e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1f7f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f800 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
1f810 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1f820 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1f830 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
1f840 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
1f850 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f860 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
1f870 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
1f880 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
1f890 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
1f8a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1f8b0 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
1f8c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1f8d0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
1f8e0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
1f8f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f900 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f910 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
1f920 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
1f930 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
1f940 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
1f950 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
1f960 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
1f970 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
1f980 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
1f990 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
1f9a0 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
1f9b0 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
1f9c0 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
1f9d0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
1f9e0 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
1f9f0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
1fa00 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
1fa10 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
1fa20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
1fa30 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
1fa40 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
1fa50 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
1fa60 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
1fa70 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
1fa80 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
1fa90 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
1faa0 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
1fab0 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
1fac0 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
1fad0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
1fae0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
1faf0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
1fb00 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
1fb10 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
1fb20 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
1fb30 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
1fb40 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
1fb50 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
1fb60 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
1fb70 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1fb80 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
1fb90 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
1fba0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
1fbb0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
1fbc0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
1fbd0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
1fbe0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
1fbf0 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
1fc00 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
1fc10 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
1fc20 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
1fc30 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
1fc40 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
1fc50 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1fc60 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
1fc70 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1fc80 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
1fc90 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
1fca0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
1fcb0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
1fcc0 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
1fcd0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
1fce0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
1fcf0 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
1fd00 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
1fd10 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
1fd20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
1fd30 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
1fd40 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
1fd50 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
1fd60 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
1fd70 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
1fd80 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
1fd90 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
1fda0 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
1fdb0 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
1fdc0 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
1fdd0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
1fde0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
1fdf0 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
1fe00 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
1fe10 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
1fe20 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
1fe30 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
1fe40 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
1fe50 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
1fe60 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
1fe70 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
1fe80 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
1fe90 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
1fea0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
1feb0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
1fec0 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
1fed0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
1fee0 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
1fef0 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
1ff00 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
1ff10 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
1ff20 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
1ff30 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
1ff40 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
1ff50 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
1ff60 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
1ff70 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
1ff80 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
1ff90 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1ffa0 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
1ffb0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
1ffc0 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
1ffd0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
1ffe0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
1fff0 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
20000 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
20010 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
20020 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
20030 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
20040 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
20050 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
20060 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
20070 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
20080 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
20090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
200a0 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
200b0 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
200c0 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
200d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
200e0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
200f0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
20100 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
20110 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
20120 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
20130 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
20140 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
20150 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20160 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
20170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20180 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
20190 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
201a0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
201b0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
201c0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
201d0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
201e0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
201f0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
20200 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
20210 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
20220 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20230 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
20240 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
20250 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
20260 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20270 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
20280 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
20290 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
202a0 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
202b0 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
202c0 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
202d0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
202e0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
202f0 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
20300 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
20310 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
20320 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  ;.  pPager->chan
20330 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
20340 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
20350 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69  .  if( !pSavepoi
20360 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61  nt && pagerUseWa
20370 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
20380 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c   return pagerRol
20390 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29  lbackWal(pPager)
203a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20  ;.  }..  /* Use 
203b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
203c0 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
203d0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
203e0 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
203f0 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
20400 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
20410 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
20420 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
20430 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20440 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
20450 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
20460 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
20470 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
20480 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20490 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
204a0 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
204b0 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
204c0 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72  rnalOff;.  asser
204d0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
204e0 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a  Pager)==0 || szJ
204f0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  ==0 );..  /* Beg
20500 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
20510 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
20520 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20530 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
20540 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
20550 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
20560 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
20570 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
20580 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
20590 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
205a0 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
205b0 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
205c0 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
205d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
205e0 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
205f0 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
20600 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
20610 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
20620 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
20630 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
20640 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
20650 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
20660 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
20670 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
20680 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73  oint && !pagerUs
20690 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
206a0 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
206b0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
206c0 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
206d0 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
206e0 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
206f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
20700 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
20710 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
20720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
20730 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20740 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
20750 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
20760 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
20770 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
20780 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
20790 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
207a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
207b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
207c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
207d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
207e0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
207f0 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
20800 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
20810 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20820 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
20830 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
20840 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
20850 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
20860 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
20870 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
20880 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20890 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
208a0 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
208b0 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
208c0 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
208d0 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
208e0 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
208f0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
20900 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20910 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
20920 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
20930 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
20940 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
20950 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
20960 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
20970 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
20980 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
20990 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
209a0 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
209b0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
209c0 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
209d0 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
209e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
209f0 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
20a00 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
20a10 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
20a20 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
20a30 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
20a40 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
20a50 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
20a60 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
20a70 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
20a80 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
20a90 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
20aa0 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
20ab0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
20ac0 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
20ad0 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
20ae0 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
20af0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
20b00 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
20b10 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
20b20 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
20b30 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
20b40 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
20b50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
20b60 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
20b70 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
20b80 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
20b90 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
20ba0 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
20bb0 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
20bc0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
20bd0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
20be0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
20bf0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
20c00 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
20c10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
20c20 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20c30 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
20c40 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
20c50 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
20c60 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29  ournalOff>=szJ )
20c70 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
20c80 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
20c90 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
20ca0 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
20cb0 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
20cc0 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
20cd0 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
20ce0 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
20cf0 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
20d00 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
20d10 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
20d20 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
20d30 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
20d40 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
20d50 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
20d60 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
20d70 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
20d80 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
20d90 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f  t = (i64)pSavepo
20da0 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
20db0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20dc0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
20dd0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20de0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
20df0 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e  lite3WalSavepoin
20e00 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  tUndo(pPager->pW
20e10 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  al, pSavepoint->
20e20 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d  aWalData);.    }
20e30 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
20e40 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
20e50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20e60 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
20e70 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
20e80 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
20e90 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50  t==(i64)ii*(4+pP
20ea0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
20eb0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
20ec0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
20ed0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
20ee0 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
20ef0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
20f00 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20f10 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
20f20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
20f30 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
20f40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20f50 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
20f60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
20f70 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
20f80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
20f90 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
20fa0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
20fb0 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
20fc0 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
20fd0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
20fe0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
20ff0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
21000 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
21010 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
21020 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
21030 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
21040 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73  }../*.** Free as
21050 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
21060 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
21070 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  e pager..*/.void
21080 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
21090 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ink(Pager *pPage
210a0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
210b0 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72  cheShrink(pPager
210c0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
210d0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
210e0 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
210f0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
21100 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
21110 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
21120 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
21130 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
21140 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
21150 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
21160 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
21170 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
21180 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
21190 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
211a0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
211b0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
211c0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
211d0 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
211e0 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
211f0 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
21200 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
21210 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
21220 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
21230 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
21240 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
21250 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
21260 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
21270 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
21280 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
21290 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
212a0 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
212b0 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
212c0 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
212d0 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
212e0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
212f0 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
21300 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
21310 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
21320 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
21330 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
21340 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
21350 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
21360 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
21370 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
21380 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
21390 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
213a0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
213b0 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
213c0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
213d0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
213e0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
213f0 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
21400 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
21410 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
21420 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
21430 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
21440 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
21450 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
21460 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
21470 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21480 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
21490 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
214a0 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
214b0 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
214c0 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
214d0 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
214e0 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
214f0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
21500 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
21510 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
21520 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
21530 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
21540 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
21550 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
21560 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
21570 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
21580 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66  * The above is f
21590 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  or a rollback-jo
215a0 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72  urnal mode.  For
215b0 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63   WAL mode, OFF c
215c0 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d  ontinues.** to m
215d0 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63  ean that no sync
215e0 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e  s ever occur.  N
215f0 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74  ORMAL means that
21600 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63   the WAL is sync
21610 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74  ed.** prior to t
21620 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63  he start of chec
21630 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20  kpoint and that 
21640 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21650 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61  e is synced.** a
21660 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
21670 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
21680 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  nt if the entire
21690 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
216a0 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74  WAL.** was writt
216b0 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
216c0 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20   database.  But 
216d0 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f  no sync operatio
216e0 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20  ns occur for.** 
216f0 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d  an ordinary comm
21700 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64  it in NORMAL mod
21710 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c  e with WAL.  FUL
21720 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
21730 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20   WAL.** file is 
21740 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
21750 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65   each commit ope
21760 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74  ration, in addit
21770 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79  ion to the.** sy
21780 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ncs associated w
21790 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a  ith NORMAL..**.*
217a0 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65  * Do not confuse
217b0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
217c0 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59  L with SQLITE_SY
217d0 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a  NC_FULL.  The.**
217e0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
217f0 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f  L macro means to
21800 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d   use the MacOSX-
21810 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63  style full-fsync
21820 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  .** using fcntl(
21830 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53  F_FULLFSYNC).  S
21840 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
21850 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e  L means to do an
21860 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79  .** ordinary fsy
21870 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72  nc() call.  Ther
21880 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
21890 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54  ce between SQLIT
218a0 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61  E_SYNC_FULL.** a
218b0 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  nd SQLITE_SYNC_N
218c0 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72  ORMAL on platfor
218d0 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61  ms other than Ma
218e0 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a  cOSX.  But the.*
218f0 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  * synchronous=FU
21900 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72  LL versus synchr
21910 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74  onous=NORMAL set
21920 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20  ting determines 
21930 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e  when.** the xSyn
21940 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63  c primitive is c
21950 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c  alled and is rel
21960 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61  evant to all pla
21970 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75  tforms..**.** Nu
21980 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
21990 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
219a0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
219b0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
219c0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
219d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
219e0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
219f0 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
21a00 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
21a10 76 65 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50  vel(.  Pager *pP
21a20 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
21a30 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
21a40 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
21a50 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c  r */.  int level
21a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
21a70 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
21a80 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f  us.  1=OFF, 2=NO
21a90 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 20  RMAL, 3=FULL */ 
21aa0 20 0a 20 20 69 6e 74 20 62 46 75 6c 6c 46 73 79   .  int bFullFsy
21ab0 6e 63 2c 20 20 20 20 20 20 20 2f 2a 20 50 52 41  nc,       /* PRA
21ac0 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20 2a 2f  GMA fullfsync */
21ad0 0a 20 20 69 6e 74 20 62 43 6b 70 74 46 75 6c 6c  .  int bCkptFull
21ae0 46 73 79 6e 63 20 20 20 20 2f 2a 20 50 52 41 47  Fsync    /* PRAG
21af0 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75  MA checkpoint_fu
21b00 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20  llfsync */.){.  
21b10 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31  assert( level>=1
21b20 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a   && level<=3 );.
21b30 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
21b40 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c   =  (level==1 ||
21b50 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
21b60 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
21b70 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c  r->fullSync = (l
21b80 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
21b90 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
21ba0 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  :0;.  if( pPager
21bb0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
21bc0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
21bd0 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  s = 0;.    pPage
21be0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21bf0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
21c00 28 20 62 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a  ( bFullFsync ){.
21c10 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
21c20 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
21c30 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50  YNC_FULL;.    pP
21c40 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
21c50 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21c60 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20  C_FULL;.  }else 
21c70 69 66 28 20 62 43 6b 70 74 46 75 6c 6c 46 73 79  if( bCkptFullFsy
21c80 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
21c90 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
21ca0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
21cb0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
21cc0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
21cd0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
21ce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
21cf0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
21d00 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
21d10 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
21d20 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
21d30 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
21d40 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MAL;.  }.  pPage
21d50 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
21d60 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
21d70 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ags;.  if( pPage
21d80 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
21d90 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
21da0 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53  ncFlags |= WAL_S
21db0 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
21dc0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
21dd0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
21de0 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
21df0 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
21e00 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
21e10 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
21e20 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
21e30 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
21e40 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
21e50 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
21e60 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
21e70 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
21e80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
21e90 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
21ea0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
21eb0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
21ec0 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
21ed0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
21ee0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
21ef0 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
21f00 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
21f10 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
21f20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
21f30 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
21f40 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
21f50 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
21f60 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
21f70 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
21f80 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
21f90 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
21fa0 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
21fb0 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
21fc0 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
21fd0 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
21fe0 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
21ff0 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
22000 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
22010 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
22020 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
22030 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
22040 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
22050 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
22060 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
22070 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
22080 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
22090 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
220a0 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
220b0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
220c0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
220d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
220e0 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
220f0 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
22100 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
22110 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
22120 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
22130 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
22140 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
22150 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
22160 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
22170 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
22180 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
22190 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
221a0 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
221b0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
221c0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
221d0 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
221e0 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
221f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
22200 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
22210 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
22220 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22230 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
22240 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
22250 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
22260 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
22270 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
22280 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
22290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
222a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
222b0 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
222c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
222d0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
222e0 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
222f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
22300 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
22310 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
22320 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
22330 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
22340 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
22350 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
22360 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
22370 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
22380 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
22390 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
223a0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
223b0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
223c0 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
223d0 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
223e0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
223f0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
22400 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
22410 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
22420 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
22430 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
22440 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
22450 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
22460 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
22470 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
22480 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
22490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224a0 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
224b0 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
224c0 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
224d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
224e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
224f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
22500 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
22510 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
22520 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
22530 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
22540 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
22550 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
22560 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
22570 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
22580 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
22590 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
225a0 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
225b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
225c0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
225d0 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
225e0 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
225f0 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
22600 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
22610 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
22620 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
22630 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
22640 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
22650 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
22660 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
22670 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
22680 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
22690 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
226b0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
226c0 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
226d0 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
226e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
226f0 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
22700 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
22710 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
22720 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
22730 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
22740 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
22750 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
22760 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
22770 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
22780 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
22790 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
227a0 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
227b0 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  Arg;..  if( isOp
227c0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
227d0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20  {.    void **ap 
227e0 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67  = (void **)&pPag
227f0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
22800 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
22810 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28  int(*)(void *))(
22820 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61  ap[0]))==xBusyHa
22830 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73  ndler );.    ass
22840 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73  ert( ap[1]==pBus
22850 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20  yHandlerArg );. 
22860 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
22870 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
22880 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
22890 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52  CNTL_BUSYHANDLER
228a0 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20  , (void *)ap);. 
228b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
228c0 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
228d0 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
228e0 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
228f0 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
22900 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
22910 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
22920 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
22930 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
22940 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
22950 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
22960 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
22970 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
22980 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
22990 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
229a0 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
229b0 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
229c0 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  R, an SQLITE_IOE
229d0 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20  RR_xxx sub-code 
229e0 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
229f0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
22a00 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
22a10 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
22a20 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
22a30 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
22a40 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
22a50 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
22a60 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
22a70 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
22a80 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
22a90 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
22aa0 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
22ab0 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
22ac0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
22ad0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
22ae0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
22af0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
22b00 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
22b10 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
22b20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
22b30 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
22b40 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
22b50 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
22b60 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
22b70 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
22b80 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
22b90 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
22ba0 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
22bb0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
22bc0 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
22bd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
22be0 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
22bf0 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
22c00 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
22c10 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
22c20 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
22c30 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
22c40 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
22c50 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
22c60 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
22c70 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
22c80 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
22c90 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
22ca0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
22cb0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
22cc0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
22cd0 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
22ce0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
22cf0 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
22d00 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
22d10 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
22d20 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
22d30 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
22d40 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
22d50 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
22d60 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
22d70 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
22d80 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
22d90 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
22da0 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
22db0 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
22dc0 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
22dd0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
22de0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22df0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
22e00 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
22e10 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  32 *pPageSize, i
22e20 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
22e30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22e40 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  OK;..  /* It is 
22e50 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
22e60 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74  do a full assert
22e70 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68  _pager_state() h
22e80 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a  ere, as this.  *
22e90 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  * function may b
22ea0 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  e called from wi
22eb0 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29  thin PagerOpen()
22ec0 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61  , before the sta
22ed0 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50  te.  ** of the P
22ee0 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69  ager object is i
22ef0 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73  nternally consis
22f00 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tent..  **.  ** 
22f10 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69  At one point thi
22f20 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
22f30 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ned an error if 
22f40 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
22f50 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52   .  ** PAGER_ERR
22f60 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69  OR state. But si
22f70 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20  nce PAGER_ERROR 
22f80 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73  state guarantees
22f90 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65   that.  ** there
22fa0 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
22fb0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
22fc0 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69  e reference, thi
22fd0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
22fe0 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
22ff0 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e  hat case anyhow.
23000 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67  .  */..  u32 pag
23010 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
23020 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ze;.  assert( pa
23030 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
23040 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
23050 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
23060 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
23070 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
23080 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
23090 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
230a0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
230b0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
230c0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
230d0 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20  .   && pageSize 
230e0 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33  && pageSize!=(u3
230f0 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
23100 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  ze .  ){.    cha
23110 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20  r *pNew = NULL; 
23120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23130 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f  ew temp space */
23140 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d  .    i64 nByte =
23150 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   0;..    if( pPa
23160 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
23170 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e  R_OPEN && isOpen
23180 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
23190 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
231a0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
231b0 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29  ger->fd, &nByte)
231c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
231d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
231e0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63  .      pNew = (c
231f0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
23200 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
23210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
23220 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ew ) rc = SQLITE
23230 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20  _NOMEM;.    }.. 
23240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  E_OK ){.      pa
23260 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
23270 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
23280 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29  >dbSize = (Pgno)
23290 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65  ((nByte+pageSize
232a0 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20  -1)/pageSize);. 
232b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
232c0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
232d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
232e0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
232f0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
23300 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
23310 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
23320 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
23330 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
23340 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
23350 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Size);.    }.  }
23360 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  ..  *pPageSize =
23370 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
23380 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  e;.  if( rc==SQL
23390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
233a0 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e  ( nReserve<0 ) n
233b0 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72  Reserve = pPager
233c0 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
233d0 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
233e0 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
233f0 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67  1000 );.    pPag
23400 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
23410 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  i16)nReserve;.  
23420 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
23430 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
23440 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23450 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
23460 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65  inter to the "te
23470 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75  mporary page" bu
23480 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e  ffer held intern
23490 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70  ally.** by the p
234a0 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61  ager.  This is a
234b0 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20   buffer that is 
234c0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
234d0 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ld the.** entire
234e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61   content of a da
234f0 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
23500 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65  is buffer is use
23510 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
23520 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
23530 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
23540 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72  written whenever
23550 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
23560 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65  ccurs.  But othe
23570 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72  r modules are fr
23580 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f  ee to use it too
23590 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  , as long as.** 
235a0 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65  no rollbacks are
235b0 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76   happening..*/.v
235c0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
235d0 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72  rTempSpace(Pager
235e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
235f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  urn pPager->pTmp
23600 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Space;.}../*.** 
23610 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
23620 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
23630 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
23640 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
23650 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
23660 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
23670 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
23680 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
23690 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
236a0 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
236b0 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
236c0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
236d0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
236e0 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
236f0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
23700 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
23710 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
23720 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23730 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
23740 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23750 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
23760 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
23770 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
23780 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
23790 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
237a0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
237b0 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43  PEN );      /* C
237c0 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50  alled only by OP
237d0 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61  _MaxPgcnt */.  a
237e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
237f0 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64  xPgno>=pPager->d
23800 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f  bSize );  /* OP_
23810 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65  MaxPgcnt enforce
23820 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75  s this */.  retu
23830 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
23840 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
23850 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
23860 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
23870 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
23880 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
23890 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
238a0 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
238b0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
238c0 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
238d0 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
238e0 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
238f0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
23900 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
23910 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
23920 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
23930 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
23940 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
23950 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
23960 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
23970 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
23980 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
23990 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
239a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
239b0 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
239c0 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
239d0 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
239e0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
239f0 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
23a00 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
23a10 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
23a20 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
23a30 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
23a40 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
23a50 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
23a60 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
23a70 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
23a80 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
23a90 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
23aa0 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
23ab0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
23ac0 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
23ad0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
23ae0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
23af0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
23b00 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
23b10 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
23b20 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
23b30 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
23b40 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
23b50 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
23b60 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
23b70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
23b80 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
23b90 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
23ba0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
23bb0 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
23bc0 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
23bd0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
23be0 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
23bf0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
23c00 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
23c10 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
23c20 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
23c30 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
23c40 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
23c50 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
23c60 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
23c70 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
23c80 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
23c90 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
23ca0 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
23cb0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
23cc0 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
23cd0 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
23ce0 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
23cf0 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
23d00 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
23d10 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
23d20 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
23d30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
23d40 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
23d50 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
23d60 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
23d70 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
23d80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
23d90 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
23da0 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
23db0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23dc0 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
23dd0 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
23de0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
23df0 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
23e00 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  tempFile );..  /
23e10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
23e20 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
23e30 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65   btree immediate
23e40 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e  ly after creatin
23e50 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72  g.  ** the Pager
23e60 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20   object.  There 
23e70 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20  has not been an 
23e80 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74  opportunity to t
23e90 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74  ransition.  ** t
23ea0 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a  o WAL mode yet..
23eb0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
23ec0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
23ed0 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  er) );..  if( is
23ee0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
23ef0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
23f00 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
23f10 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
23f20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23f30 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
23f40 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
23f50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23f60 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
23f70 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
23f80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23f90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23fa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
23fb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
23fc0 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
23fd0 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  hen a read-trans
23fe0 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
23ff0 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20  n.** the pager. 
24000 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  It returns the t
24010 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
24020 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
24030 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  base..**.** Howe
24040 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65  ver, if the file
24050 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e   is between 1 an
24060 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79  d <page-size> by
24070 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
24080 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f  n .** this is co
24090 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67  nsidered a 1 pag
240a0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
240b0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
240c0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
240d0 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
240e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
240f0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
24100 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
24110 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
24120 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
24130 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a  TER_FINISHED );.
24140 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74    *pnPage = (int
24150 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
24160 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
24170 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
24180 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
24190 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
241a0 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
241b0 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
241c0 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
241d0 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
241e0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
241f0 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
24200 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
24210 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
24220 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
24230 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
24240 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
24250 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
24260 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
24270 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
24280 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
24290 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
242a0 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
242b0 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
242c0 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
242d0 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
242e0 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
242f0 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
24300 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
24310 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
24320 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
24330 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
24340 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
24350 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
24360 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
24370 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
24380 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
24390 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
243a0 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
243b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
243c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
243d0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
243e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
243f0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
24400 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
24410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24420 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
24430 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  code */..  /* Ch
24440 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
24450 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
24460 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
24470 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
24480 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
24490 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
244a0 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
244b0 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
244c0 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
244d0 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
244e0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
244f0 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
24500 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
24510 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
24520 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
24530 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e   (pPager->eLock>
24540 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
24550 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
24560 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ock==NO_LOCK && 
24570 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
24580 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c  _LOCK).       ||
24590 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
245a0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
245b0 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  & locktype==EXCL
245c0 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
245d0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ..  do {.    rc 
245e0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
245f0 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ager, locktype);
24600 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
24610 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
24620 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
24630 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
24640 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
24650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24660 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
24670 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
24680 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
24690 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
246a0 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
246b0 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
246c0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
246d0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
246e0 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
246f0 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
24700 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
24710 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
24720 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
24730 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
24740 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
24750 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
24760 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
24770 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
24780 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
24790 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
247a0 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
247b0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
247c0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
247d0 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
247e0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
247f0 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
24800 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
24810 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
24820 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
24830 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
24840 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
24850 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
24860 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
24870 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
24880 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
24890 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
248a0 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
248b0 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
248c0 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
248d0 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
248e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
248f0 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
24900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24910 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
24920 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
24930 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
24940 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
24950 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
24960 63 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75  ct behaviour wou
24970 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
24980 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
24990 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
249a0 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
249b0 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
249c0 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
249d0 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
249e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
249f0 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
24a00 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
24a10 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
24a20 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
24a30 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
24a40 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
24a50 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
24a60 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
24a70 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
24a80 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
24a90 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
24aa0 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
24ab0 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
24ac0 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
24ad0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
24ae0 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
24af0 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
24b00 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
24b10 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
24b20 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
24b30 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
24b40 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
24b50 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
24b60 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
24b70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
24b80 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
24b90 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
24ba0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
24bb0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
24bc0 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
24bd0 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
24be0 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
24bf0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
24c00 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
24c10 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
24c20 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
24c30 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
24c40 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
24c50 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
24c60 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
24c70 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
24c80 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
24c90 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
24ca0 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
24cb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
24cc0 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
24cd0 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
24ce0 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
24cf0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
24d00 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
24d10 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
24d20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
24d30 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
24d40 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
24d50 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
24d60 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
24d70 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
24d80 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
24d90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24da0 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
24db0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
24dc0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
24dd0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
24de0 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  MOD );.  pPager-
24df0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
24e00 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  .  assertTruncat
24e10 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
24e20 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  er);.}.../*.** T
24e30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24e40 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74  called before at
24e50 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a  tempting a hot-j
24e60 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
24e70 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65   It.** syncs the
24e80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
24e90 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73   disk, then sets
24ea0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
24eb0 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69  Hdr to the.** si
24ec0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
24ed0 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74  l file so that t
24ee0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
24ef0 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77  k() routine know
24f00 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e  s.** that the en
24f10 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tire journal fil
24f20 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
24f30 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67  d..**.** Syncing
24f40 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74   a hot-journal t
24f50 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74  o disk before at
24f60 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
24f70 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73   it back ensures
24f80 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70   .** that if a p
24f90 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63  ower-failure occ
24fa0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
24fb0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f  ollback, the pro
24fc0 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74  cess that.** att
24fd0 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66  empts rollback f
24fe0 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
24ff0 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68  recovery sees th
25000 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a  e same journal.*
25010 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69  * content as thi
25020 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  s process..**.**
25030 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   If everything g
25040 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  oes as planned, 
25050 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
25060 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
25070 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
25080 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
25090 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
250a0 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  yncHotJournal(Pa
250b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
250c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
250d0 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
250e0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
250f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
25100 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
25110 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
25120 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MAL);.  }.  if( 
25130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25140 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25150 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
25160 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
25170 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
25180 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25190 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
251a0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
251b0 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
251c0 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
251d0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
251e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
251f0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
25200 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
25210 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
25220 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
25230 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
25240 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
25250 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
25260 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
25270 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
25280 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
25290 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
252a0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
252b0 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
252c0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
252d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
252e0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
252f0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
25300 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
25310 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
25320 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
25330 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
25340 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
25350 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
25360 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
25370 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
25380 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
25390 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
253a0 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
253b0 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
253c0 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
253d0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
253e0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
253f0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
25400 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
25410 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70  ger){.  u8 *pTmp
25420 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
25430 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61  >pTmpSpace;..  a
25440 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
25450 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
25460 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73  ) );.  disable_s
25470 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
25480 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rs();.  sqlite3B
25490 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
254a0 28 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ();.  /* pPager-
254b0 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f  >errCode = 0; */
254c0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
254d0 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69  siveMode = 0;.#i
254e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
254f0 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57  T_WAL.  sqlite3W
25500 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  alClose(pPager->
25510 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b  pWal, pPager->ck
25520 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61  ptSyncFlags, pPa
25530 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
25540 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Tmp);.  pPager->
25550 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  pWal = 0;.#endif
25560 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
25570 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
25580 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
25590 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
255a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
255b0 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20   If it is open, 
255c0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
255d0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
255e0 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  ling UnlockAndRo
255f0 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49  llback..    ** I
25600 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f  f this is not do
25610 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79  ne, then an unsy
25620 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
25630 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
25640 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61   .    ** file ma
25650 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  y be played back
25660 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
25670 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66  se. If a power f
25680 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20  ailure occurs . 
25690 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73     ** while this
256a0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
256b0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
256c0 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
256d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
256e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
256f0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
25700 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  to sync the jour
25710 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70  nal, shift the p
25720 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  ager.    ** into
25730 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
25740 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e  . This causes Un
25750 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20  lockAndRollback 
25760 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20  to unlock the.  
25770 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e    ** database an
25780 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  d close the jour
25790 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74  nal file without
257a0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
257b0 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61  oll it.    ** ba
257c0 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69  ck or finalize i
257d0 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61  t. The next data
257e0 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68  base user will h
257f0 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f  ave to do hot-jo
25800 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c  urnal.    ** rol
25810 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63  lback before acc
25820 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
25830 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
25840 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
25850 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
25860 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
25870 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53  r(pPager, pagerS
25880 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
25890 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
258a0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
258b0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
258c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
258d0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
258e0 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
258f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
25900 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
25910 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
25920 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
25930 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
25940 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
25950 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  )).  sqlite3OsCl
25960 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
25970 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ;.  sqlite3OsClo
25980 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
25990 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
259a0 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74  e(pTmp);.  sqlit
259b0 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50  e3PcacheClose(pP
259c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
259d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
259e0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
259f0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
25a00 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
25a10 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
25a20 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a  Codec);.#endif..
25a30 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
25a40 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
25a50 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
25a60 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
25a70 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
25a80 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
25a90 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
25aa0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
25ab0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
25ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25ad0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
25ae0 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
25af0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
25b00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25b10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
25b20 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
25b30 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
25b40 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
25b50 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
25b60 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
25b70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
25b80 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
25b90 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
25ba0 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
25bb0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
25bc0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
25bd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
25be0 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
25bf0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
25c00 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
25c10 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
25c20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
25c30 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
25c40 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
25c50 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
25c60 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
25c70 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
25c80 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
25c90 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
25ca0 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
25cb0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
25cc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
25cd0 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  er.noSync flag i
25ce0 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  s set, then this
25cf0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
25d00 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o-op..** Otherwi
25d10 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
25d20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
25d30 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
25d40 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ode and the .** 
25d50 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
25d60 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69  istics of the fi
25d70 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
25d80 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
25d90 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
25da0 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
25db0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
25dc0 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
25dd0 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
25de0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
25df0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
25e00 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
25e10 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
25e20 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
25e30 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
25e40 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
25e50 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
25e60 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
25e70 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
25e80 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
25e90 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
25ea0 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
25eb0 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
25ec0 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
25ed0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
25ee0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
25ef0 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
25f00 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
25f10 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
25f20 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
25f30 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
25f40 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
25f50 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
25f60 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
25f70 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
25f80 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
25f90 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
25fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25fb0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
25fc0 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
25fd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
25fe0 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
25ff0 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
26000 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
26010 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
26020 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
26030 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
26040 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
26050 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
26060 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
26070 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
26080 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
26090 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
260a0 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
260b0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
260c0 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
260d0 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
260e0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
260f0 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
26100 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
26110 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
26120 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
26130 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
26140 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
26150 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
26160 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
26170 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
26180 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
26190 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
261a0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
261b0 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29  ger, int newHdr)
261c0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
261f0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
26200 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
26210 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
26220 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
26230 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
26240 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
26250 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
26260 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
26270 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
26280 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
26290 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
262a0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
262b0 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
262c0 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
262d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
262e0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
262f0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
26300 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
26310 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
26320 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
26330 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
26340 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
26350 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
26360 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
26370 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
26380 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20  const int iDc = 
26390 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
263a0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
263b0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
263c0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
263d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
263e0 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
263f0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26400 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
26410 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
26420 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
26430 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f  h an obscure pro
26440 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73  blem. If the las
26450 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  t connection.   
26460 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f       ** that wro
26470 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  te to this datab
26480 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e  ase was operatin
26490 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d  g in persistent-
264a0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
264b0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  ** mode, then th
264c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
264d0 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ay at this point
264e0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72   actually be lar
264f0 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ger.        ** t
26500 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  han Pager.journa
26510 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74  lOff bytes. If t
26520 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e  he next thing in
26530 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
26540 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70       ** file hap
26550 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75  pens to be a jou
26560 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69  rnal-header (wri
26570 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tten as part of 
26580 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
26590 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  revious connecti
265a0 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  on's transaction
265b0 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
265c0 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
265d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
265e0 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
265f0 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
26600 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
26610 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
26620 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
26630 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
26640 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
26650 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
26660 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
26670 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
26680 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
26690 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
266a0 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
266b0 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
266c0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
266d0 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
266e0 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
266f0 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
26700 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
26710 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
26720 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
26730 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
26740 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
26750 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
26760 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
26770 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
26780 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
26790 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
267a0 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
267b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
267c0 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
267d0 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
267e0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
267f0 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
26800 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
26810 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
26820 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
26830 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
26840 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
26850 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
26860 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
26870 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26880 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
26890 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
268a0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
268b0 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
268c0 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
268d0 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
268e0 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
268f0 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
26900 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
26910 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
26920 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
26930 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
26940 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
26950 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
26960 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
26970 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
26980 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
26990 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
269a0 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
269b0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65  ;.        u8 zHe
269c0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
269d0 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
269e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
269f0 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
26a00 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
26a10 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
26a20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
26a30 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
26a40 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
26a50 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
26a60 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48  ..        iNextH
26a70 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e  drOffset = journ
26a80 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
26a90 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
26aa0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
26ab0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
26ac0 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72  gic, 8, iNextHdr
26ad0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
26ae0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26af0 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  OK && 0==memcmp(
26b00 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
26b10 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20  Magic, 8) ){.   
26b20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
26b30 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20  nst u8 zerobyte 
26b40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
26b50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
26b60 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
26b70 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e  &zerobyte, 1, iN
26b80 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
26b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26ba0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26bb0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
26bc0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
26bd0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
26be0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26bf0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
26c00 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
26c10 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
26c20 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
26c30 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
26c40 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
26c50 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
26c60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
26c70 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
26c80 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
26c90 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
26ca0 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
26cb0 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
26cc0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
26cd0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
26ce0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
26cf0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
26d00 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26d10 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
26d20 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
26d30 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
26d40 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
26d50 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
26d60 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
26d70 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
26d80 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
26d90 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
26da0 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
26db0 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
26dc0 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
26dd0 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
26de0 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
26df0 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
26e00 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
26e10 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
26e20 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
26e30 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
26e40 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
26e50 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26e60 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
26e70 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
26e80 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26e90 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
26ea0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
26eb0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
26ec0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
26ed0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
26ee0 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
26ef0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
26f00 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
26f10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26f20 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
26f30 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
26f40 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
26f50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26f60 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26f70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26f80 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
26f90 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  DR %p %lld\n", p
26fa0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
26fb0 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20  ournalHdr));.   
26fc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26fd0 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20  3OsWrite(.      
26fe0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
26ff0 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
27000 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61  of(zHeader), pPa
27010 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  ger->journalHdr.
27020 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
27030 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27040 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27060 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
27070 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
27080 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
27090 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
270a0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
270b0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
270c0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
270d0 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
270e0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
270f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
27100 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
27110 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
27120 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20  yncFlags| .     
27130 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
27140 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ncFlags==SQLITE_
27150 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
27160 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
27170 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
27180 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27190 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
271a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
271b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
271c0 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
271d0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
271e0 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20    if( newHdr && 
271f0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
27200 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
27210 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
27220 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
27230 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
27240 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
27250 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
27260 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27270 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27280 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
27290 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
272a0 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
272b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
272c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
272d0 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
272e0 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65  s in noSync mode
272f0 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
27300 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a  le was just .  *
27310 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  * successfully s
27320 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61  ynced. Either wa
27330 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  y, clear the PGH
27340 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
27350 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70  g on .  ** all p
27360 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ages..  */.  sql
27370 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
27380 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
27390 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61  >pPCache);.  pPa
273a0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
273b0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
273c0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
273d0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
273e0 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
273f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27400 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
27410 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
27420 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
27430 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
27440 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
27450 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
27460 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
27470 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
27480 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
27490 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
274a0 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
274b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
274c0 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
274d0 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
274e0 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
274f0 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
27500 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
27510 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
27520 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
27530 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
27540 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
27550 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
27560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
27570 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
27580 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
27590 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
275a0 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
275b0 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
275c0 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
275d0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
275e0 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
275f0 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
27600 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
27610 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
27620 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
27630 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27640 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
27650 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
27660 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
27670 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
27680 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
27690 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
276a0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
276b0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
276c0 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
276d0 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
276e0 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
276f0 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
27700 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
27710 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
27720 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
27730 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
27740 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
27750 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
27760 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
27770 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
27780 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
27790 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
277a0 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
277b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
277c0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
277d0 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
277e0 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
277f0 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
27800 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
27810 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
27820 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
27830 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
27840 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
27850 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
27860 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
27870 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
27880 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
27890 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
278a0 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
278b0 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
278c0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
278d0 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
278e0 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
278f0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
27900 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
27910 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
27920 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
27930 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
27940 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
27950 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
27960 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
27970 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
27980 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
27990 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
279a0 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
279b0 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
279c0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
279d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
279e0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
279f0 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61  elist(Pager *pPa
27a00 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73  ger, PgHdr *pLis
27a10 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
27a20 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
27a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27a40 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
27a50 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
27a60 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
27a70 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  for rollback pag
27a80 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42  ers in WRITER_DB
27a90 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  MOD state. */.  
27aa0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
27ab0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
27ac0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27ad0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
27ae0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a  WRITER_DBMOD );.
27af0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27b00 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
27b10 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
27b20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
27b30 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
27b40 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
27b50 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
27b60 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
27b70 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
27b80 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
27b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
27ba0 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
27bb0 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
27bc0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
27bd0 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
27be0 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
27bf0 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
27c00 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
27c10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27c20 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
27c30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
27c40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
27c50 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
27c60 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
27c70 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
27c80 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
27c90 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
27ca0 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
27cb0 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
27cc0 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
27cd0 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
27ce0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
27cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
27d00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
27d10 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
27d20 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
27d30 72 2d 3e 64 62 53 69 7a 65 3e 70 50 61 67 65 72  r->dbSize>pPager
27d40 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 7b 0a  ->dbHintSize ){.
27d50 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
27d60 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65  4 szFile = pPage
27d70 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73  r->pageSize * (s
27d80 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61  qlite3_int64)pPa
27d90 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
27da0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
27db0 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
27dc0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
27dd0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73  TL_SIZE_HINT, &s
27de0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67  zFile);.    pPag
27df0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
27e00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
27e10 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
27e20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27e30 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
27e40 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
27e50 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
27e60 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
27e70 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
27e80 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
27e90 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
27ea0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
27eb0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
27ec0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
27ed0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
27ee0 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
27ef0 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
27f00 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
27f10 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
27f20 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
27f30 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
27f40 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
27f50 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
27f60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
27f70 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
27f80 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
27f90 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
27fa0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
27fb0 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
27fc0 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
27fd0 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20  rDontWrite()).. 
27fe0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
27ff0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
28000 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
28010 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
28020 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
28030 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
28040 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
28050 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
28060 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
28070 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
28080 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
280b0 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
280c0 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72     ..      asser
280d0 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  t( (pList->flags
280e0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
280f0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
28100 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
28110 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
28120 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
28130 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  st);..      /* E
28140 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ncode the databa
28150 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45  se */.      CODE
28160 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
28170 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
28180 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
28190 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a  NOMEM, pData);..
281a0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
281b0 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
281c0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
281d0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
281e0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
281f0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
28200 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
28210 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
28220 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
28230 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
28240 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
28250 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
28260 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
28270 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
28280 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
28290 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
282a0 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
282b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
282c0 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
282d0 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
282e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
282f0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
28300 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
28310 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
28320 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
28330 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
28340 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
28350 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
28360 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
28370 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
28380 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
28390 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
283a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
283b0 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
283c0 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20  RITE]++;..      
283d0 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61  /* Update any ba
283e0 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70  ckup objects cop
283f0 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
28400 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e  s of this pager.
28410 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
28420 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
28430 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
28440 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d  gno, (u8*)pList-
28450 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >pData);..      
28460 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f  PAGERTRACE(("STO
28470 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
28480 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
284b0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
284c0 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a  ehash(pList)));.
284d0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
284e0 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
284f0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
28500 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
28510 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
28520 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
28530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28540 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
28550 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
28560 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28570 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
28580 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
28590 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
285a0 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
285b0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
285c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
285d0 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74  ../*.** Ensure t
285e0 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  hat the sub-jour
285f0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
28600 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
28610 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a  dy open, this .*
28620 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
28630 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
28640 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
28650 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
28660 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
28670 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20  to plan. An .** 
28680 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
28690 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
286a0 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
286b0 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
286c0 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a  en() .** fails..
286d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
286e0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
286f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
28700 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28710 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  K;.  if( !isOpen
28720 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
28730 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
28740 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
28750 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
28760 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65  _MEMORY || pPage
28770 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
28780 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28790 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
287a0 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
287b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
287c0 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
287d0 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
287e0 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f  ->sjfd, SQLITE_O
287f0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
28800 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28810 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28820 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64   Append a record
28830 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
28840 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50  state of page pP
28850 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  g to the sub-jou
28860 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20  rnal. .** It is 
28870 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
28880 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73  onsibility to us
28890 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  e subjRequiresPa
288a0 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a  ge() to check .*
288b0 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61  * that it is rea
288c0 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66  lly required bef
288d0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
288e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
288f0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
28900 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72  set the bit corr
28910 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67  esponding to pPg
28920 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69  ->pgno in the bi
28930 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c  tvecs.** for all
28940 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
28950 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
28960 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  g..**.** This fu
28970 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
28980 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
28990 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
289a0 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65  sful, an IO.** e
289b0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65  rror code if the
289c0 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
289d0 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  e to the sub-jou
289e0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
289f0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
28a00 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
28a10 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20  s while setting 
28a20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70  a bit in a savep
28a30 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a  oint.** bitvec..
28a40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
28a50 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48  bjournalPage(PgH
28a60 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
28a70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28a80 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
28a90 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
28aa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
28ab0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
28ac0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
28ad0 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ){..    /* Open 
28ae0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
28af0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
28b00 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
28b10 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ed */.    assert
28b20 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
28b30 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
28b40 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
28b50 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72  r->jfd) || pager
28b60 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
28b70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
28b80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
28b90 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53  d) || pPager->nS
28ba0 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  ubRec==0 );.    
28bb0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
28bc0 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20  Wal(pPager) .   
28bd0 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a        || pageInJ
28be0 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20  ournal(pPg) .   
28bf0 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67        || pPg->pg
28c00 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
28c10 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20  gSize .    );.  
28c20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
28c30 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a  urnal(pPager);..
28c40 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
28c50 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70  b-journal was op
28c60 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ened successfull
28c70 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64  y (or was alread
28c80 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20  y open),.    ** 
28c90 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  write the journa
28ca0 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  l record into th
28cb0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  e file.  */.    
28cc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28cd0 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  K ){.      void 
28ce0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
28cf0 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f  ata;.      i64 o
28d00 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 50 61  ffset = (i64)pPa
28d10 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b  ger->nSubRec*(4+
28d20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28d30 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  );.      char *p
28d40 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20  Data2;.  .      
28d50 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
28d60 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
28d70 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
28d80 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
28d90 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
28da0 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
28db0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
28dc0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28dd0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
28de0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
28df0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
28e00 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
28e10 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
28e20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28e30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28e40 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
28e50 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
28e60 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
28e70 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
28e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28e90 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
28ea0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
28eb0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
28ec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
28ed0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
28ee0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
28ef0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
28f00 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
28f10 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
28f20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28f30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
28f40 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
28f50 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
28f60 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68  hen it has reach
28f70 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20  ed some.** soft 
28f80 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68  memory limit. Th
28f90 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
28fa0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
28fb0 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a   a Pager object.
28fc0 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f  ** (cast as a vo
28fd0 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20  id*). The pager 
28fe0 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65  is always 'purge
28ff0 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e  able' (not an in
29000 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
29010 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ase). The second
29020 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72   argument is a r
29030 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61  eference to a pa
29040 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63  ge that is .** c
29050 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62  urrently dirty b
29060 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  ut has no outsta
29070 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
29080 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  . The page.** is
29090 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74   always associat
290a0 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65  ed with the Page
290b0 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
290c0 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
290d0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
290e0 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
290f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20   function is to 
29100 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62  make pPg clean b
29110 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f  y writing its co
29120 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f  ntents.** out to
29130 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29140 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  le, if possible.
29150 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76   This may involv
29160 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a  e syncing the.**
29170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
29180 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
29190 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63  ful, sqlite3Pcac
291a0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
291b0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70   called on the p
291c0 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  age and.** SQLIT
291d0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
291e0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
291f0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
29200 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  g to make the.**
29210 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65   page clean, the
29220 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
29230 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
29240 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  he page cannot b
29250 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20  e.** made clean 
29260 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72  for some other r
29270 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72  eason, but no er
29280 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
29290 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
292a0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
292b0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
292c0 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  ean() is not cal
292d0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
292e0 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76  nt pagerStress(v
292f0 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70  oid *p, PgHdr *p
29300 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
29310 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
29320 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
29330 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
29340 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
29350 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
29360 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
29370 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a  PGHDR_DIRTY );..
29380 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79    /* The doNotSy
29390 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20  ncSpill flag is 
293a0 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73  set during times
293b0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79   when doing a sy
293c0 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e  nc of.  ** journ
293d0 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61  al (and adding a
293e0 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20   new header) is 
293f0 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68  not allowed.  Th
29400 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  is occurs.  ** d
29410 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73  uring calls to s
29420 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29430 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  () while trying 
29440 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69  to journal multi
29450 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ple.  ** pages b
29460 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
29470 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a  same sector..  *
29480 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74  *.  ** The doNot
29490 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62  Spill flag inhib
294a0 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70  its all cache sp
294b0 69 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73  illing regardles
294c0 73 20 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a  s of whether.  *
294d0 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20  * or not a sync 
294e0 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68  is required.  Th
294f0 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  is is set during
29500 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a   a rollback..  *
29510 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20  *.  ** Spilling 
29520 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74  is also prohibit
29530 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72  ed when in an er
29540 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20  ror state since 
29550 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20  that could.  ** 
29560 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
29570 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49   corruption.   I
29580 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
29590 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74 20 0a  plementaton it .
295a0 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62    ** is impossib
295b0 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63  le for sqlite3Pc
295c0 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62  acheFetch() to b
295d0 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72  e called with cr
295e0 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20 20 2a 2a  eateFlag==1.  **
295f0 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72   while in the er
29600 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65  ror state, hence
29610 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   it is impossibl
29620 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
29630 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61  ne to.  ** be ca
29640 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f  lled in the erro
29650 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74  r state.  Nevert
29660 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75  heless, we inclu
29670 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a  de a NEVER().  *
29680 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65  * test for the e
29690 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20  rror state as a 
296a0 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73  safeguard agains
296b0 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73  t future changes
296c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
296d0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
296e0 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  de) ) return SQL
296f0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
29700 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
29710 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29720 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
29730 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
29740 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  l && (pPg->flags
29750 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
29760 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  NC)!=0 ){.    re
29770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29780 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72    }..  pPg->pDir
29790 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61  ty = 0;.  if( pa
297a0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
297b0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74  ) ){.    /* Writ
297c0 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  e a single frame
297d0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74   for this page t
297e0 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20  o the log. */.  
297f0 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
29800 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a  esPage(pPg) ){ .
29810 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
29820 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20  urnalPage(pPg); 
29830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
29840 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29850 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
29860 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
29870 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  , pPg, 0, 0);.  
29880 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a    }.  }else{.  .
29890 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
298a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
298b0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
298c0 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
298d0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
298e0 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
298f0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
29900 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
29910 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
29920 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
29930 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ger, 1);.    }. 
29940 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
29950 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
29960 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67  his page is larg
29970 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
29980 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  ent size of.    
29990 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
299a0 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65  image, it may ne
299b0 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ed to be written
299c0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
299d0 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  nal..    ** This
299e0 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
299f0 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72  call to pager_wr
29a00 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62  ite_pagelist() b
29a10 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  elow will not.  
29a20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72    ** actually wr
29a30 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  ite data to the 
29a40 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
29a50 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
29a60 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   Consider the fo
29a70 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65  llowing sequence
29a80 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20   of events:.    
29a90 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49  **.    **   BEGI
29aa0 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a  N;.    **     <j
29ab0 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20  ournal page X>. 
29ac0 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66     **     <modif
29ad0 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a  y page X>.    **
29ae0 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
29af0 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  p;.    **       
29b00 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65  <shrink database
29b10 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73   file to Y pages
29b20 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70  >.    **       p
29b30 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20  agerStress(page 
29b40 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f  X).    **     RO
29b50 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20  LLBACK TO sp;.  
29b60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28    **.    ** If (
29b70 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20  X>Y), then when 
29b80 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63  pagerStress is c
29b90 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c  alled page X wil
29ba0 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
29bb0 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74  .    ** out to t
29bc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29bd0 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72  , but will be dr
29be0 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  opped from the c
29bf0 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20  ache. Then,.    
29c00 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
29c10 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
29c20 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61  " statement, rea
29c30 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c  ding page X will
29c40 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74   read.    ** dat
29c50 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
29c60 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77  ase file. This w
29c70 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20  ill be the copy 
29c80 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a  of page X as it.
29c90 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20      ** was when 
29ca0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
29cb0 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20  started, not as 
29cc0 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56  it was when "SAV
29cd0 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a  EPOINT sp".    *
29ce0 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a  * was executed..
29cf0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
29d00 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
29d10 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
29d20 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65  nt data for page
29d30 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20   X into the .   
29d40 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   ** sub-journal 
29d50 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20  file now (if it 
29d60 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74  is not already t
29d70 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69  here), so that i
29d80 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
29d90 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
29da0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77   current value w
29db0 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
29dc0 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20  K TO sp" is .   
29dd0 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20   ** executed..  
29de0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56    */.    if( NEV
29df0 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d  ER(.        rc==
29e00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67  SQLITE_OK && pPg
29e10 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
29e20 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71  bSize && subjReq
29e30 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
29e40 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63     ) ){.      rc
29e50 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
29e60 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
29e70 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
29e80 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
29e90 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
29ea0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29eb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
29ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29ed0 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d     assert( (pPg-
29ee0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
29ef0 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
29f00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
29f10 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
29f20 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20  ager, pPg);.    
29f30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
29f40 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
29f50 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
29f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29f70 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
29f80 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
29f90 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
29fa0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
29fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
29fc0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
29fd0 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
29fe0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
29ff0 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a  ager, rc); .}...
2a000 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2a010 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  nd initialize a 
2a020 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74  new Pager object
2a030 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
2a040 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a  er to it.** in *
2a050 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67  ppPager. The pag
2a060 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75  er should eventu
2a070 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79  ally be freed by
2a080 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74   passing it.** t
2a090 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  o sqlite3PagerCl
2a0a0 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ose()..**.** The
2a0b0 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
2a0c0 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20  ent is the path 
2a0d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2a0e0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a  file to open..**
2a0f0 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2a100 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
2a110 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
2a120 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
2a130 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
2a140 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
2a150 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70   be cached. Temp
2a160 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20  orary files are 
2a170 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
2a180 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
2a190 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64   they are closed
2a1a0 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  . If zFilename i
2a1b0 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
2a1c0 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d  n .** all inform
2a1d0 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
2a1e0 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65   cache. It is ne
2a1f0 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
2a200 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61  isk. .** This ca
2a210 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
2a220 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d  lement an in-mem
2a230 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
2a240 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70  .** The nExtra p
2a250 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69  arameter specifi
2a260 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
2a270 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2a280 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f  allocated.** alo
2a290 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67  ng with each pag
2a2a0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69  e reference. Thi
2a2b0 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  s space is avail
2a2c0 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
2a2d0 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69  .** via the sqli
2a2e0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
2a2f0 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68  () API..**.** Th
2a300 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
2a310 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63   is used to spec
2a320 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74  ify properties t
2a330 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a  hat affect the.*
2a340 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  * operation of t
2a350 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f  he pager. It sho
2a360 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f  uld be passed so
2a370 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69  me bitwise combi
2a380 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  nation.** of the
2a390 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a   PAGER_* flags..
2a3a0 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61  **.** The vfsFla
2a3b0 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  gs parameter is 
2a3c0 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73  a bitmask to pas
2a3d0 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70  s to the flags p
2a3e0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
2a3f0 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f  he xOpen() metho
2a400 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  d of the supplie
2a410 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69  d VFS when openi
2a420 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a  ng files. .**.**
2a430 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   If the pager ob
2a440 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
2a450 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  d and the specif
2a460 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ied file opened 
2a470 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
2a480 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2a490 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
2a4a0 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e  ager set to poin
2a4b0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
2a4c0 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
2a4d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2a4e0 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65  , *ppPager is se
2a4f0 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64  t to NULL.** and
2a500 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   error code retu
2a510 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  rned. This funct
2a520 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2a530 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28  QLITE_NOMEM.** (
2a540 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20  sqlite3Malloc() 
2a550 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
2a560 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c  ate memory), SQL
2a570 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20  ITE_CANTOPEN or 
2a580 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49  .** various SQLI
2a590 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73  TE_IO_XXX errors
2a5a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a5b0 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c  PagerOpen(.  sql
2a5c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2a5d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
2a5e0 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  tual file system
2a5f0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67   to use */.  Pag
2a600 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
2a610 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
2a620 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
2a630 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
2a640 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a650 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
2a660 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2a670 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
2a680 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2a690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2a6a0 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
2a6b0 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
2a6c0 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
2a6d0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2a6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2a6f0 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
2a700 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
2a710 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20  t vfsFlags,     
2a720 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2a730 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
2a740 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
2a750 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20  pen() */.  void 
2a760 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
2a770 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  e*) /* Function 
2a780 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20  to reinitialize 
2a790 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  pages */.){.  u8
2a7a0 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
2a7b0 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20  *pPager = 0;    
2a7c0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
2a7d0 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ct to allocate a
2a7e0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  nd return */.  i
2a7f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a800 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
2a810 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2a820 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20  tempFile = 0;   
2a830 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2a840 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63   temp files (inc
2a850 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  l. in-memory fil
2a860 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  es) */.  int mem
2a870 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Db = 0;         
2a880 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2a890 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
2a8a0 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2a8b0 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
2a8c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a8d0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
2a8e0 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
2a8f0 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
2a900 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
2a910 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2a920 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
2a930 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
2a940 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
2a950 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
2a960 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2a970 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
2a980 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
2a990 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2a9a0 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
2a9b0 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
2a9c0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
2a9d0 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
2a9e0 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
2a9f0 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
2aa00 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
2aa10 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2aa20 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
2aa30 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2aa40 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
2aa50 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u32 szPageDflt =
2aa60 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2aa70 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
2aa80 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2aa90 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2aaa0 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f   *zUri = 0;    /
2aab0 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f  * URI args to co
2aac0 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69  py */.  int nUri
2aad0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2aae0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2aaf0 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20  tes of URI args 
2ab00 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f  at *zUri */..  /
2ab10 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
2ab20 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72   much space is r
2ab30 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
2ab40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
2ab50 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65  ndle.  ** (there
2ab60 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d   are two of them
2ab70 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  , the main journ
2ab80 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a  al and the sub-j
2ab90 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20  ournal). This.  
2aba0 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ** is the maximu
2abb0 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  m space required
2abc0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
2abd0 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  y journal file h
2abe0 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20  andle .  ** and 
2abf0 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  a regular journa
2ac00 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e  l file-handle. N
2ac10 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75  ote that a "regu
2ac20 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64  lar journal-hand
2ac30 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  le".  ** may be 
2ac40 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c  a wrapper capabl
2ac50 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65  e of caching the
2ac60 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f   first portion o
2ac70 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
2ac80 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72  ** file in memor
2ac90 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  y to implement t
2aca0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
2acb0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65  optimization (se
2acc0 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66  e .  ** source f
2acd0 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a  ile journal.c)..
2ace0 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
2acf0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
2ad00 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  fs)>sqlite3MemJo
2ad10 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20  urnalSize() ){. 
2ad20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2ad30 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
2ad40 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2ad50 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Vfs));.  }else{.
2ad60 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2ad70 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2ad80 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
2ad90 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ze());.  }..  /*
2ada0 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
2adb0 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c  variable to NULL
2adc0 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
2add0 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a  r occurs. */.  *
2ade0 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69  ppPager = 0;..#i
2adf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ae00 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28  T_MEMORYDB.  if(
2ae10 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d   flags & PAGER_M
2ae20 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d  EMORY ){.    mem
2ae30 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  Db = 1;.    if( 
2ae40 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2ae50 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2ae60 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
2ae70 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
2ae80 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
2ae90 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2aea0 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53  e==0  ) return S
2aeb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2aec0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2aed0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2aee0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2aef0 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
2af00 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2af10 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
2af20 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
2af30 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
2af40 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
2af50 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
2af60 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
2af70 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
2af80 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
2af90 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2afa0 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
2afb0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
2afc0 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
2afd0 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
2afe0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2aff0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2b000 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2b010 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2b020 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2b030 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
2b040 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
2b050 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e  locRaw(0, nPathn
2b060 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
2b070 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
2b080 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2b090 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2b0a0 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30  .    zPathname[0
2b0b0 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73  ] = 0; /* Make s
2b0c0 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ure initialized 
2b0d0 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68  even if FullPath
2b0e0 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a  name() fails */.
2b0f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b100 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
2b110 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
2b120 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68  nPathname, zPath
2b130 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68  name);.    nPath
2b140 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2b150 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2b160 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20  );.    z = zUri 
2b170 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c  = &zFilename[sql
2b180 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
2b190 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20  lename)+1];.    
2b1a0 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
2b1b0 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53     z += sqlite3S
2b1c0 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20  trlen30(z)+1;.  
2b1d0 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2b1e0 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2b1f0 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20     }.    nUri = 
2b200 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55  (int)(&z[1] - zU
2b210 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ri);.    assert(
2b220 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20   nUri>=0 );.    
2b230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b240 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38  K && nPathname+8
2b250 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
2b260 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
2b270 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2b280 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  en when the jour
2b290 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65  nal path require
2b2a0 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  d by.      ** th
2b2b0 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
2b2c0 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
2b2d0 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e  more than pVfs->
2b2e0 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  mxPathname.     
2b2f0 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e   ** bytes in len
2b300 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  gth. This means 
2b310 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
2b320 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20  not be opened,. 
2b330 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69       ** as it wi
2b340 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
2b350 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
2b360 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65  ournal file or e
2b370 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65  ven.      ** che
2b380 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ck for a hot-jou
2b390 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64  rnal before read
2b3a0 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
2b3b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b3c0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2b3d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
2b3e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b3f0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2b400 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2b410 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2b420 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2b430 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
2b440 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
2b450 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
2b460 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
2b470 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
2b480 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
2b490 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2b4a0 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
2b4b0 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
2b4c0 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
2b4d0 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
2b4e0 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2b4f0 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
2b500 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b510 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
2b520 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
2b530 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
2b540 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b550 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
2b560 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
2b570 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2b580 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
2b590 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
2b5a0 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
2b5b0 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
2b5c0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2b5d0 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
2b5e0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2b5f0 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
2b600 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2b610 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
2b620 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2b630 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2b640 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
2b650 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2b660 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
2b670 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
2b680 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2b690 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2b6a0 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
2b6b0 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
2b6c0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
2b6d0 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
2b6e0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2b6f0 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
2b700 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2b710 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
2b720 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
2b730 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
2b740 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
2b750 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
2b760 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
2b770 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
2b780 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2b790 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
2b7a0 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
2b7b0 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
2b7c0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
2b7d0 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20   + nUri +       
2b7e0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
2b7f0 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
2b800 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 8 + 2         
2b810 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
2b820 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2b830 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2b840 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20  + nPathname + 4 
2b850 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2f  + 2            /
2b860 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66  * zWal */.#endif
2b870 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
2b880 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2b890 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
2b8a0 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
2b8b0 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
2b8c0 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
2b8d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2b8e0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2b8f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b900 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
2b910 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
2b920 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
2b930 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
2b940 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
2b950 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2b960 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2b970 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
2b980 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
2b990 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2b9a0 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
2b9b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
2b9c0 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
2b9d0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2b9e0 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2b9f0 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
2ba00 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
2ba10 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
2ba20 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
2ba30 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2ba40 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
2ba50 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2ba60 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
2ba70 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2ba80 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
2ba90 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
2baa0 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
2bab0 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
2bac0 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
2bad0 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
2bae0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
2baf0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  thname ){.    as
2bb00 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e  sert( nPathname>
2bb10 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
2bb20 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63  >zJournal =   (c
2bb30 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50  har*)(pPtr += nP
2bb40 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55  athname + 1 + nU
2bb50 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2bb60 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2bb70 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
2bb80 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  athname);.    if
2bb90 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28  ( nUri ) memcpy(
2bba0 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  &pPager->zFilena
2bbb0 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c  me[nPathname+1],
2bbc0 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
2bbd0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2bbe0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68  >zJournal, zPath
2bbf0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2bc00 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
2bc10 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
2bc20 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
2bc30 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b  rnal\000", 8+2);
2bc40 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
2bc50 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e  Suffix3(pPager->
2bc60 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2bc70 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69  r->zJournal);.#i
2bc80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2bc90 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72  T_WAL.    pPager
2bca0 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72  ->zWal = &pPager
2bcb0 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
2bcc0 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d  name+8+1];.    m
2bcd0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57  emcpy(pPager->zW
2bce0 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2bcf0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2bd00 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2bd10 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  Wal[nPathname], 
2bd20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29  "-wal\000", 4+1)
2bd30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2bd40 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2bd50 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2bd60 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69  er->zWal);.#endi
2bd70 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  f.    sqlite3DbF
2bd80 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2bd90 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
2bda0 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
2bdb0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
2bdc0 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20   = vfsFlags;..  
2bdd0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
2bde0 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  r file..  */.  i
2bdf0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2be00 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2be10 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
2be20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2be30 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
2be40 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f  s returned by xO
2be50 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20  pen() */.    rc 
2be60 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
2be70 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
2be80 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2be90 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26  >fd, vfsFlags, &
2bea0 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72  fout);.    asser
2beb0 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20  t( !memDb );.   
2bec0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75   readOnly = (fou
2bed0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
2bee0 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a  ADONLY);..    /*
2bef0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
2bf00 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
2bf10 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
2bf20 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
2bf30 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61  ** choose a defa
2bf40 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ult page size in
2bf50 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f   case we have to
2bf60 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20   create the.    
2bf70 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2bf80 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61  . The default pa
2bf90 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d  ge size is the m
2bfa0 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a  aximum of:.    *
2bfb0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51  *.    **    + SQ
2bfc0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2bfd0 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20  E_SIZE,.    **  
2bfe0 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65    + The value re
2bff0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
2c000 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a  3OsSectorSize().
2c010 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2c020 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a  largest page siz
2c030 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72  e that can be wr
2c040 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
2c050 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2c060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c070 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  & !readOnly ){. 
2c080 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
2c090 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
2c0a0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2c0b0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2c0c0 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  E<=SQLITE_MAX_DE
2c0d0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
2c0e0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50 61  ;.      if( szPa
2c0f0 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73  geDflt<pPager->s
2c100 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
2c110 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2c120 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49  >sectorSize>SQLI
2c130 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2c140 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
2c150 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2c160 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
2c170 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2c180 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2c190 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2c1a0 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67  Dflt = (u32)pPag
2c1b0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
2c1c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c1d0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2c1e0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2c1f0 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ITE.      {.    
2c200 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
2c210 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2c220 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2c230 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
2c240 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
2c250 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2c260 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
2c270 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
2c280 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2c290 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
2c2a0 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
2c2b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2c2c0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2c2d0 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
2c2e0 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  36);.        for
2c2f0 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
2c300 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
2c310 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2c320 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
2c330 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
2c340 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2c350 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20  IC|(ii>>8)) ){. 
2c360 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2c370 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20  eDflt = ii;.    
2c380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c390 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
2c3a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2c3b0 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70      /* If a temp
2c3c0 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65  orary file is re
2c3d0 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e  quested, it is n
2c3e0 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69  ot opened immedi
2c3f0 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e  ately..    ** In
2c400 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63   this case we ac
2c410 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74  cept the default
2c420 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64   page size and d
2c430 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20  elay actually.  
2c440 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65    ** opening the
2c450 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
2c460 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73  first call to Os
2c470 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Write()..    **.
2c480 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
2c490 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66  ch is also run f
2c4a0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
2c4b0 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d  database. An in-
2c4c0 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61  memory.    ** da
2c4d0 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61  tabase is the sa
2c4e0 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c  me as a temp-fil
2c4f0 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20  e that is never 
2c500 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20  written out to. 
2c510 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75     ** disk and u
2c520 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ses an in-memory
2c530 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2c540 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74  l..    */ .    t
2c550 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
2c560 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2c570 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
2c580 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
2c590 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  k = EXCLUSIVE_LO
2c5a0 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79  CK;.    readOnly
2c5b0 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c   = (vfsFlags&SQL
2c5c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2c5d0 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  Y);.  }..  /* Th
2c5e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
2c5f0 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65   to PagerSetPage
2c600 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f  size() serves to
2c610 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   set the value o
2c620 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61  f .  ** Pager.pa
2c630 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c  geSize and to al
2c640 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
2c650 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
2c660 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
2c670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c680 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c690 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20  r->memDb==0 );. 
2c6a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2c6b0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2c6c0 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44  pPager, &szPageD
2c6d0 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  flt, -1);.    te
2c6e0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
2c6f0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
2c700 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2c710 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65  ccurred in eithe
2c720 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
2c730 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
2c740 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75  .  ** Pager stru
2c750 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
2c760 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
2c770 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c780 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2c790 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ( !pPager->pTmpS
2c7a0 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  pace );.    sqli
2c7b0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
2c7c0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  r->fd);.    sqli
2c7d0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
2c7e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2c7f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
2c800 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65  alize the PCache
2c810 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73   object. */.  as
2c820 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30  sert( nExtra<100
2c830 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20  0 );.  nExtra = 
2c840 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a  ROUND8(nExtra);.
2c850 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f    sqlite3PcacheO
2c860 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
2c870 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c890 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
2c8a0 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
2c8b0 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
2c8c0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50  ->pPCache);..  P
2c8d0 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e  AGERTRACE(("OPEN
2c8e0 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
2c8f0 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
2c900 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
2c910 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52  lename));.  IOTR
2c920 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
2c930 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
2c940 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2c950 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ..  pPager->useJ
2c960 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
2c970 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50  Journal;.  /* pP
2c980 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
2c990 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2c9a0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
2c9b0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2c9c0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
2c9d0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2c9e0 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
2c9f0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
2ca00 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2ca10 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
2ca20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2ca30 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
2ca40 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
2ca50 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2ca60 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
2ca70 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20  OCK; */.#if 0.  
2ca80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ca90 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69  state == (tempFi
2caa0 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55  le ? PAGER_EXCLU
2cab0 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c  SIVE : PAGER_UNL
2cac0 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  OCK) );.#endif. 
2cad0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
2cae0 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
2caf0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
2cb00 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
2cb10 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
2cb20 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2cb30 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
2cb40 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
2cb50 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2cb60 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
2cb70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2cb80 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2cb90 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
2cba0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2cbb0 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
2cbc0 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
2cbd0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2cbe0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
2cbf0 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
2cc00 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
2cc10 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
2cc20 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
2cc30 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20  Only;.  assert( 
2cc40 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
2cc50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2cc60 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
2cc70 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
2cc80 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61  pFile;.  if( pPa
2cc90 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2cca0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ccb0 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29  r->fullSync==0 )
2ccc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2ccd0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
2cce0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2ccf0 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  ( pPager->walSyn
2cd00 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2cd10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2cd20 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d  >ckptSyncFlags==
2cd30 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
2cd40 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
2cd50 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  nc = 1;.    pPag
2cd60 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
2cd70 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2cd80 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
2cd90 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  walSyncFlags = S
2cda0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2cdb0 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41  L | WAL_SYNC_TRA
2cdc0 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70  NSACTIONS;.    p
2cdd0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2cde0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2cdf0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  NC_NORMAL;.  }. 
2ce00 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2ce10 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
2ce20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
2ce30 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
2ce40 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
2ce50 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2ce60 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29  ->nExtra = (u16)
2ce70 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
2ce80 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
2ce90 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
2cea0 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
2ceb0 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
2cec0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2ced0 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
2cee0 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
2cef0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
2cf00 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29  f( !useJournal )
2cf10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2cf20 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2cf30 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2cf40 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d  F;.  }else if( m
2cf50 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
2cf60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2cf70 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
2cf80 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  ODE_MEMORY;.  }.
2cf90 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75    /* pPager->xBu
2cfa0 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
2cfb0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2cfc0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
2cfd0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2cfe0 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
2cff0 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65  init;.  /* memse
2d000 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
2d010 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
2d020 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a  r->aHash)); */..
2d030 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
2d040 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
2d050 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a  LITE_OK;.}..../*
2d060 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2d070 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
2d080 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
2d090 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
2d0a0 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
2d0b0 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
2d0c0 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
2d0d0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
2d0e0 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2d0f0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2d100 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
2d110 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
2d120 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
2d130 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
2d140 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
2d150 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
2d160 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
2d170 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
2d180 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
2d190 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
2d1a0 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
2d1b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2d1c0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2d1d0 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
2d1e0 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
2d1f0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2d200 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
2d210 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2d220 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
2d230 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2d240 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
2d250 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
2d260 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
2d270 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
2d280 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
2d290 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2d2a0 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
2d2b0 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
2d2c0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
2d2d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d2e0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
2d2f0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
2d300 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
2d310 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
2d320 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
2d330 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
2d340 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2d350 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
2d360 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
2d370 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
2d380 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
2d390 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
2d3a0 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2d3b0 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
2d3c0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
2d3d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2d3e0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
2d3f0 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
2d400 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2d410 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
2d420 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
2d430 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
2d440 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
2d450 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2d460 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2d470 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
2d480 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2d490 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
2d4a0 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
2d4b0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
2d4c0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2d4d0 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
2d4e0 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
2d4f0 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
2d500 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
2d510 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
2d520 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
2d530 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
2d540 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
2d550 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
2d560 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
2d570 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
2d580 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
2d590 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
2d5a0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
2d5b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2d5c0 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
2d5d0 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
2d5e0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2d5f0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2d600 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2d610 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
2d620 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2d630 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2d640 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2d650 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
2d660 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
2d670 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
2d680 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
2d690 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
2d6a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2d6b0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
2d6c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2d6d0 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
2d6e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2d6f0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2d700 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
2d710 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2d720 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2d730 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2d740 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20  exists = 1;     
2d750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d760 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
2d770 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
2d780 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e  /.  int jrnlOpen
2d790 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67   = !!isOpen(pPag
2d7a0 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73  er->jfd);..  ass
2d7b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2d7c0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
2d7d0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2d7e0 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
2d7f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2d800 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2d810 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72  );..  assert( jr
2d820 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73  nlOpen==0 || ( s
2d830 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2d840 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2d850 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20  ager->jfd) &.   
2d860 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
2d870 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
2d880 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45  PEN.  ));..  *pE
2d890 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28  xists = 0;.  if(
2d8a0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2d8b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2d8c0 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
2d8d0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
2d8e0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2d8f0 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
2d900 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2d910 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
2d920 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
2d930 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
2d940 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
2d950 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
2d960 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
2d970 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63  k */..    /* Rac
2d980 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65  e condition here
2d990 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65  :  Another proce
2d9a0 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ss might have be
2d9b0 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  en holding the. 
2d9c0 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56     ** the RESERV
2d9d0 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65  ED lock and have
2d9e0 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20   a journal open 
2d9f0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  at the sqlite3Os
2da00 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a  Access() .    **
2da10 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74   call above, but
2da20 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
2da30 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f   journal and dro
2da40 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72  p the lock befor
2da50 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20  e.    ** we get 
2da60 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2da70 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2da80 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61  eservedLock() ca
2da90 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20  ll.  If that.   
2daa0 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c   ** is the case,
2dab0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
2dac0 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20  ght think there 
2dad0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
2dae0 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20   when.    ** in 
2daf0 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f  fact there is no
2db00 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ne.  This result
2db10 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  s in a false-pos
2db20 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c  itive which will
2db30 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
2db40 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61   with by the pla
2db50 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20  yback routine.  
2db60 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20  Ticket #3883..  
2db70 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2db80 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2db90 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
2dba0 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
2dbb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2dbc0 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
2dbd0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  ){.      Pgno nP
2dbe0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2dbf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2dc00 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
2dc10 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
2dc20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20     /* Check the 
2dc30 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2dc40 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74  base file. If it
2dc50 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70   consists of 0 p
2dc60 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74  ages,.      ** t
2dc70 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
2dc80 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65  ournal file. See
2dc90 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
2dca0 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20  ent above for . 
2dcb0 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73       ** the reas
2dcc0 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c  oning here.  Del
2dcd0 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65  ete the obsolete
2dce0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e   journal file un
2dcf0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52  der.      ** a R
2dd00 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
2dd10 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69  avoid race condi
2dd20 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f  tions and to avo
2dd30 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20  id violating.   
2dd40 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a     ** [H33020]..
2dd50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2dd60 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
2dd70 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
2dd80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2dd90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2dda0 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
2ddb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2ddc0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
2ddd0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
2dde0 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
2ddf0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
2de00 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
2de10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2de20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
2de30 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
2de40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2de50 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2de60 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
2de70 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67  lusiveMode ) pag
2de80 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
2de90 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
2dea0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2deb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
2dec0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
2ded0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2dee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2def0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2df00 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
2df10 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
2df20 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
2df30 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
2df40 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2df50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
2df60 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
2df70 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
2df80 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
2df90 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
2dfa0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2dfb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2dfc0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
2dfd0 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
2dfe0 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
2dff0 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
2e000 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
2e010 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
2e020 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
2e030 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e040 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
2e050 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2e060 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
2e070 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
2e080 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2e090 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
2e0a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2e0b0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2e0c0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2e0d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
2e0e0 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &f);.          }
2e0f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2e100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e110 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
2e120 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
2e130 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e140 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
2e150 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
2e160 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
2e170 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2e180 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
2e190 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
2e1a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2e1b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e1d0 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
2e1e0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2e1f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2e200 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2e210 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e220 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
2e230 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b  ts = (first!=0);
2e240 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2e250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e260 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
2e270 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
2e280 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65   cannot open the
2e290 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2e2a0 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  l file in order 
2e2b0 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20  to see if.      
2e2c0 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61 73        ** its has
2e2d0 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
2e2e0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
2e2f0 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
2e300 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
2e310 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
2e320 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
2e330 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
2e340 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
2e350 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
2e360 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
2e370 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
2e380 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
2e390 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
2e3a0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
2e3b0 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
2e3c0 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
2e3d0 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
2e3e0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
2e3f0 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
2e400 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
2e410 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
2e420 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
2e430 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
2e440 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
2e450 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
2e460 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
2e470 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
2e480 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
2e490 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
2e4a0 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
2e4b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2e4c0 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
2e4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2e4e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2e4f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e500 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2e510 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2e520 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2e530 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2e540 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
2e550 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
2e560 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e570 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
2e580 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
2e590 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29  e3PagerAcquire()
2e5a0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
2e5b0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
2e5c0 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
2e5d0 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
2e5e0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
2e5f0 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
2e600 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
2e610 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
2e620 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2e630 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2e640 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
2e650 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
2e660 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
2e670 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
2e680 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
2e690 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f  ently in PAGER_O
2e6a0 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f  PEN state (no lo
2e6b0 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20  ck held.**      
2e6c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2e6d0 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61  file), then an a
2e6e0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
2e6f0 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20  o obtain a.**   
2e700 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f     SHARED lock o
2e710 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2e720 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79  ile. Immediately
2e730 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
2e740 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41  .**      the SHA
2e750 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69  RED lock, the fi
2e760 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65  le-system is che
2e770 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a  cked for a hot-j
2e780 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20  ournal,.**      
2e790 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20  which is played 
2e7a0 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e  back if present.
2e7b0 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68   Following any h
2e7c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  ot-journal .**  
2e7d0 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68      rollback, th
2e7e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2e7f0 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69  e cache are vali
2e800 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e  dated by checkin
2e810 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63  g.**      the 'c
2e820 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66  hange-counter' f
2e830 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
2e840 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
2e850 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73   and.**      dis
2e860 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61  carded if they a
2e870 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69  re found to be i
2e880 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  nvalid..**.**   
2e890 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  2) If the pager 
2e8a0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
2e8b0 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e  clusive-mode, an
2e8c0 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  d there are curr
2e8d0 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f  ently.**      no
2e8e0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2e8f0 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70  erences to any p
2e900 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20  ages, and is in 
2e910 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
2e920 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e  .**      then an
2e930 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2e940 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
2e950 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73  ror state by dis
2e960 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  carding.**      
2e970 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2e980 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61  the page cache a
2e990 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  nd rolling back 
2e9a0 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  any open journal
2e9b0 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a  .**      file..*
2e9c0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
2e9d0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
2e9e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2e9f0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2ea00 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
2ea10 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
2ea20 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
2ea30 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
2ea40 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  t-journal file o
2ea50 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61  r .** rolling ba
2ea60 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
2ea70 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
2ea80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2ea90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2eaa0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
2eab0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2eac0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ead0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2eae0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2eaf0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
2eb00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
2eb10 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d  y called from b-
2eb20 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68  tree and only wh
2eb30 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  en there are no.
2eb40 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
2eb50 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70   pages. This imp
2eb60 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61  lies that the pa
2eb70 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64  ger state should
2eb80 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20   either.  ** be 
2eb90 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20  OPEN or READER. 
2eba0 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70  READER is only p
2ebb0 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70  ossible if the p
2ebc0 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69  ager is or was i
2ebd0 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76  n .  ** exclusiv
2ebe0 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20  e access mode.. 
2ebf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
2ec00 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
2ec10 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
2ec20 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  che)==0 );.  ass
2ec30 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
2ec40 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
2ec50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2ec60 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2ec70 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
2ec80 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2ec90 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28  _READER );.  if(
2eca0 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20   NEVER(MEMDB && 
2ecb0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2ecc0 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65   ){ return pPage
2ecd0 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20  r->errCode; }.. 
2ece0 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
2ecf0 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
2ed00 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2ed10 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  ER_OPEN ){.    i
2ed20 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  nt bHotJournal =
2ed30 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   1;          /* 
2ed40 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
2ed50 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ists a hot journ
2ed60 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  al-file */..    
2ed70 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
2ed80 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
2ed90 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
2eda0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
2edb0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
2edc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2edd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ede0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
2edf0 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
2ee00 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
2ee10 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
2ee20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
2ee30 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
2ee40 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
2ee50 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
2ee60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
2ee70 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2ee80 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
2ee90 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
2eea0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2eeb0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
2eec0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
2eed0 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
2eee0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
2eef0 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
2ef00 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
2ef10 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
2ef20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2ef30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ef40 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
2ef50 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
2ef60 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
2ef70 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
2ef80 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
2ef90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
2efa0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
2efb0 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
2efc0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
2efd0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
2efe0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
2eff0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
2f000 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
2f010 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
2f020 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
2f030 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
2f040 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
2f050 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
2f060 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2f070 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
2f080 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
2f090 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
2f0a0 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
2f0b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
2f0c0 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
2f0d0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
2f0e0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
2f0f0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
2f100 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
2f110 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
2f120 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
2f130 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
2f140 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
2f150 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
2f160 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
2f170 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
2f180 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
2f190 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
2f1a0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
2f1b0 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
2f1c0 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
2f1d0 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
2f1e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f1f0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
2f200 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
2f210 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
2f220 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
2f230 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
2f240 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
2f250 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
2f260 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
2f270 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2f280 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
2f290 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2f2a0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
2f2b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
2f2c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f2d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f2e0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2f2f0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
2f300 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
2f310 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
2f320 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
2f330 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
2f340 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
2f350 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
2f360 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
2f370 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
2f380 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
2f390 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
2f3a0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
2f3b0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2f3c0 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
2f3d0 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
2f3e0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
2f3f0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
2f400 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
2f410 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
2f420 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
2f430 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
2f440 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
2f450 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
2f460 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
2f470 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
2f480 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
2f490 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
2f4a0 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
2f4b0 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
2f4c0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
2f4d0 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
2f4e0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
2f4f0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
2f500 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
2f510 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
2f520 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
2f530 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
2f540 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
2f550 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
2f560 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
2f570 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
2f580 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
2f590 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
2f5a0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
2f5b0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
2f5c0 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
2f5d0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
2f5e0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
2f5f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
2f600 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
2f610 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2f620 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2f630 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
2f640 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
2f650 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
2f660 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
2f670 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
2f680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f690 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
2f6a0 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
2f6b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f6c0 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
2f6d0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
2f6e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2f6f0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2f700 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
2f710 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2f720 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
2f730 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
2f740 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
2f750 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
2f760 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2f770 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2f780 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2f790 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
2f7a0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
2f7b0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
2f7c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f7d0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2f7e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
2f7f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
2f800 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
2f810 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2f820 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2f830 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2f840 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2f850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2f860 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2f870 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
2f880 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2f890 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2f8a0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2f8b0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2f8c0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2f8d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f8e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
2f8f0 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
2f900 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
2f910 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
2f920 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
2f930 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
2f940 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
2f950 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
2f960 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
2f970 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
2f980 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
2f990 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
2f9a0 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
2f9b0 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
2f9c0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
2f9d0 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
2f9e0 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
2f9f0 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
2fa00 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
2fa10 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
2fa20 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
2fa30 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
2fa40 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
2fa50 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
2fa60 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
2fa70 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
2fa80 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
2fa90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
2faa0 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
2fab0 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
2fac0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
2fad0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2fae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
2faf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2fb00 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2fb10 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
2fb20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2fb30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fb40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2fb50 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
2fb60 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
2fb70 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2fb80 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2fb90 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
2fba0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2fbb0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
2fbc0 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
2fbd0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
2fbe0 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
2fbf0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
2fc00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2fc10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fc20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2fc30 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
2fc40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
2fc50 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
2fc60 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
2fc70 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
2fc80 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
2fc90 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
2fca0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
2fcb0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
2fcc0 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
2fcd0 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2fce0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2fcf0 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
2fd00 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
2fd10 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
2fd20 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
2fd30 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
2fd40 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
2fd50 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
2fd60 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
2fd70 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
2fd80 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
2fd90 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
2fda0 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
2fdb0 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
2fdc0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2fdd0 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
2fde0 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
2fdf0 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
2fe00 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
2fe10 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
2fe20 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
2fe30 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
2fe40 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
2fe50 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
2fe60 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
2fe70 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
2fe80 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
2fe90 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
2fea0 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
2feb0 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
2fec0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
2fed0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
2fee0 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
2fef0 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
2ff00 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
2ff10 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
2ff20 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
2ff30 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
2ff40 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
2ff50 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
2ff60 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
2ff70 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
2ff80 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
2ff90 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
2ffa0 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
2ffb0 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
2ffc0 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
2ffd0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
2ffe0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2fff0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
30000 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
30010 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
30020 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
30030 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30040 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
30050 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
30060 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
30070 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
30080 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
30090 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
300a0 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
300b0 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
300c0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
300d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
300e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
300f0 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
30100 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71  r->pBackup || sq
30110 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
30120 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
30130 61 63 68 65 29 3e 30 29 20 0a 20 20 20 20 29 7b  ache)>0) .    ){
30140 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
30150 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
30160 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
30170 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30180 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
30190 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
301a0 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
301b0 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
301c0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a  previous.      *
301d0 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
301e0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43  transaction).  C
301f0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
30200 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
30210 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
30220 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
30230 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
30240 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
30250 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
30260 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
30270 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
30280 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
30290 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
302a0 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
302b0 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
302c0 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
302d0 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
302e0 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
302f0 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
30300 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
30310 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
30320 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
30330 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
30340 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
30350 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
30360 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
30370 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
30380 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
30390 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
303a0 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
303b0 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
303c0 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
303d0 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
303e0 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
303f0 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
30400 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
30410 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
30420 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
30430 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
30440 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
30450 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30460 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a  Pgno nPage = 0;.
30470 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
30480 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
30490 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
304a0 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ];..      rc = p
304b0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
304c0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
304d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
304e0 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20  to failed;..    
304f0 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
30500 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
30510 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
30520 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
30530 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
30540 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
30550 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
30560 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
30570 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
30580 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
30590 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
305a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
305b0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
305c0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
305d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
305e0 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
305f0 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
30600 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
30610 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
30620 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
30630 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
30640 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
30650 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
30660 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
30670 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
30680 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
30690 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
306a0 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68  a WAL file in th
306b0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f  e file-system, o
306c0 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73  pen this databas
306d0 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20  e in WAL.    ** 
306e0 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  mode. Otherwise,
306f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
30700 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20  unction call is 
30710 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
30720 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
30730 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70  enWalIfPresent(p
30740 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20  Pager);.#ifndef 
30750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
30760 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30770 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72  er->pWal==0 || r
30780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
30790 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
307a0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
307b0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
307c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
307d0 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
307e0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
307f0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
30800 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
30810 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30820 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53  ER_OPEN && rc==S
30830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30840 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
30850 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61  unt(pPager, &pPa
30860 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
30870 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
30880 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30890 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
308a0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67  MEMDB );.    pag
308b0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
308c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
308d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
308e0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d  AGER_OPEN );.  }
308f0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
30900 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
30910 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72  _READER;.  }.  r
30920 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
30930 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
30940 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
30950 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c  ached zero, roll
30960 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a  back any active.
30970 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
30980 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  nd unlock the pa
30990 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  ger..**.** Excep
309a0 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  t, in locking_mo
309b0 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65  de=EXCLUSIVE whe
309c0 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  n there is nothi
309d0 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20  ng to in.** the 
309e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
309f0 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20  , the unlock is 
30a00 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e  not performed an
30a10 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  d there is.** no
30a20 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  thing to rollbac
30a30 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  k, so this routi
30a40 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
30a50 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
30a60 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
30a70 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
30a80 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65  ){.  if( (sqlite
30a90 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
30aa0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
30ab0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65  ==0) ){.    page
30ac0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
30ad0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
30ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
30af0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
30b00 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
30b10 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72   in pager pPager
30b20 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65   (a page.** refe
30b30 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44  rence has type D
30b40 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20  bPage*). If the 
30b50 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
30b60 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
30b70 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
30b80 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
30b90 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
30ba0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
30bb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
30bc0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
30bd0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
30be0 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
30bf0 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
30c00 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
30c10 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
30c20 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
30c30 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
30c40 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
30c50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
30c60 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
30c70 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
30c80 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
30c90 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
30ca0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
30cb0 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
30cc0 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
30cd0 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
30ce0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
30cf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
30d00 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
30d10 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
30d20 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
30d30 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
30d40 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
30d50 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
30d60 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
30d70 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
30d80 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
30d90 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
30da0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
30db0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
30dc0 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
30dd0 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
30de0 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
30df0 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
30e00 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
30e10 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
30e20 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
30e30 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
30e40 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a   page or if a .*
30e50 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
30e60 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
30e70 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61  e noContent para
30e80 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a  meter and the .*
30e90 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  * requested page
30ea0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
30eb0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61  stored in the ca
30ec0 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a  che, then no .**
30ed0 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61   actual disk rea
30ee0 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69  d occurs. In thi
30ef0 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  s case the memor
30f00 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a  y image of the .
30f10 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  ** page is initi
30f20 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65  alized to all ze
30f30 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ros. .**.** If n
30f40 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
30f50 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
30f60 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
30f70 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
30f80 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
30f90 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
30fa0 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63   two seperate sc
30fb0 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
30fc0 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67   a) When reading
30fd0 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
30fe0 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  f page from the 
30ff0 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a  database, and.**
31000 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20  .**   b) When a 
31010 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69  savepoint is bei
31020 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  ng rolled back a
31030 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f  nd we need to lo
31040 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77  ad.**      a new
31050 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63   page into the c
31060 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65  ache to be fille
31070 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  d with the data 
31080 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
31090 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
310a0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
310b0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
310c0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
310d0 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
310e0 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
310f0 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
31100 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
31110 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
31120 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
31130 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
31140 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
31150 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
31160 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
31170 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
31180 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
31190 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
311a0 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
311b0 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
311c0 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
311d0 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
311e0 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
311f0 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
31200 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
31210 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
31220 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
31230 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
31240 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
31250 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
31260 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
31270 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
31280 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
31290 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
312a0 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
312b0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
312c0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
312d0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
312e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
312f0 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
31300 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
31310 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
31320 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
31330 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
31340 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
31350 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
31360 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
31370 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
31380 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
31390 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
313a0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
313b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
313c0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
313d0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
313e0 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
313f0 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
31400 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
31410 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
31420 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
31430 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
31440 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
31450 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
31460 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
31470 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
31480 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
31490 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
314a0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
314b0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
314c0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
314d0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
314e0 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
314f0 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
31500 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
31510 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
31520 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31530 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
31540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
31550 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
31560 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
31570 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
31580 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
31590 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
315a0 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
315b0 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
315c0 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
315d0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
315e0 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
315f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
31600 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
31610 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
31620 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
31630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
31640 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
31650 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
31660 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
31670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31680 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
31690 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
316a0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
316b0 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
316c0 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
316d0 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f  diately. .  ** O
316e0 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73  therwise, reques
316f0 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  t the page from 
31700 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72  the PCache layer
31710 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
31720 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
31730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
31740 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
31750 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
31760 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
31770 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
31780 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31  pPCache, pgno, 1
31790 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  , ppPage);.  }..
317a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
317b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  _OK ){.    /* Ei
317c0 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f  ther the call to
317d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
317e0 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61  tch() returned a
317f0 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20  n error or the. 
31800 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20     ** pager was 
31810 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
31820 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
31830 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
31840 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
31850 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e   Set pPg to 0 an
31860 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78  d jump to the ex
31870 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e  ception handler.
31880 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30    */.    pPg = 0
31890 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72  ;.    goto pager
318a0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
318b0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
318c0 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
318d0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
318e0 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
318f0 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70  ==pPager || (*pp
31900 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30  Page)->pPager==0
31910 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50   );..  if( (*ppP
31920 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20  age)->pPager && 
31930 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
31940 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
31950 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72  e the pcache alr
31960 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  eady contains an
31970 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70   initialized cop
31980 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  y of.    ** the 
31990 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74  page. Return wit
319a0 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f  hout further ado
319b0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
319c0 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41  ( pgno<=PAGER_MA
319d0 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d  X_PGNO && pgno!=
319e0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
319f0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61  ager) );.    pPa
31a00 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
31a10 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20  _STAT_HIT]++;.  
31a20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31a30 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
31a40 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
31a50 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
31a60 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
31a70 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
31a80 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
31a90 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20  tialized.  */.. 
31aa0 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
31ab0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
31ac0 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
31ad0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
31ae0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
31af0 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
31b00 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
31b10 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
31b20 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
31b30 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
31b40 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
31b50 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
31b60 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
31b70 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
31b80 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
31b90 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
31ba0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
31bb0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31bc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
31bd0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
31be0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45     }..    if( ME
31bf0 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  MDB || pPager->d
31c00 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f  bSize<pgno || no
31c10 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70  Content || !isOp
31c20 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
31c30 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
31c40 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
31c50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
31c60 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
31c70 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
31c80 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
31c90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
31ca0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
31cb0 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
31cc0 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
31cd0 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
31ce0 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
31cf0 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
31d00 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
31d10 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
31d20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
31d30 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
31d40 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
31d50 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
31d60 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
31d70 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
31d80 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
31d90 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
31da0 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
31db0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
31dc0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
31dd0 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
31de0 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
31df0 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
31e00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
31e10 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
31e20 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
31e30 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
31e40 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
31e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
31e60 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
31e70 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
31e80 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
31e90 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
31ea0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
31eb0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
31ec0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31ed0 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
31ee0 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
31ef0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
31f00 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
31f10 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
31f20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
31f30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
31f40 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
31f50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31f60 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
31f70 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
31f80 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49  geSize);.      I
31f90 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
31fa0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
31fb0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
31fc0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
31fd0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
31fe0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
31ff0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
32000 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
32010 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
32020 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
32030 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32040 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
32050 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
32060 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
32070 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
32080 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
32090 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
320a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
320b0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20  r_acquire_err:. 
320c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
320d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
320e0 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pPg ){.    sqlit
320f0 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
32100 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
32110 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
32120 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65  ger);..  *ppPage
32130 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
32140 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
32150 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
32160 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
32170 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
32180 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
32190 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
321a0 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
321b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
321c0 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
321d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
321e0 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a  t in cache. .**.
321f0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
32200 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
32210 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
32220 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
32230 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
32240 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
32250 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
32260 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
32270 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
32280 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
32290 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
322a0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
322b0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
322c0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
322d0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
322e0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
322f0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
32300 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
32310 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
32320 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
32330 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
32340 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
32350 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
32360 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32370 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
32380 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
32390 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
323a0 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73  Cache!=0 );.  as
323b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
323c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
323d0 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
323e0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
323f0 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  R );.  sqlite3Pc
32400 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
32410 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
32420 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74   0, &pPg);.  ret
32430 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
32440 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
32450 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
32460 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
32470 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
32480 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
32490 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
324a0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
324b0 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
324c0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
324d0 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
324e0 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
324f0 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
32500 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
32510 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
32520 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
32530 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
32540 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
32550 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
32560 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67  ( pPg ){.    Pag
32570 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
32580 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71  ->pPager;.    sq
32590 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
325a0 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67  se(pPg);.    pag
325b0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
325c0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
325d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
325e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
325f0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
32600 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
32610 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
32620 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
32630 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
32640 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
32650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
32660 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
32670 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
32680 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
32690 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
326a0 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
326b0 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
326c0 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
326d0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
326e0 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
326f0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
32700 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
32710 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
32720 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
32730 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
32740 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
32750 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
32760 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
32770 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
32780 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
32790 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
327a0 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
327b0 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
327c0 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
327d0 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
327e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
327f0 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
32800 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
32810 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
32820 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
32830 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
32840 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
32850 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
32860 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
32870 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
32880 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
32890 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
328a0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
328b0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
328c0 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
328d0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
328e0 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
328f0 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
32900 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
32910 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
32920 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
32930 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
32940 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
32950 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
32960 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
32970 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
32980 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
32990 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
329a0 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
329b0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
329c0 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
329d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
329e0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
329f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
32a00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32a20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
32a30 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
32a40 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
32a50 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
32a60 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
32a70 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
32a80 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
32a90 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32aa0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
32ab0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
32ac0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
32ad0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
32ae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
32af0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
32b00 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
32b10 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
32b20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
32b30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
32b40 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
32b50 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
32b60 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
32b70 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
32b80 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
32b90 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
32ba0 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
32bb0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
32bc0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
32bd0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
32be0 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  ode;..  if( !pag
32bf0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
32c00 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
32c10 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
32c20 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
32c30 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  {.    pPager->pI
32c40 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
32c50 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
32c60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
32c70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
32c80 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
32c90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
32ca0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
32cb0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
32cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32cd0 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
32ce0 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
32cf0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
32d00 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
32d10 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
32d20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
32d30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32d40 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
32d50 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
32d60 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
32d70 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
32d80 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  se{.        cons
32d90 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
32da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32db0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
32dc0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
32dd0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53  e */.          S
32de0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
32df0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
32e00 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
32e10 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
32e20 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
32e30 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
32e40 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
32e50 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
32e60 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
32e70 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
32e80 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
32e90 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
32ea0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
32eb0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
32ec0 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  E.        rc = s
32ed0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
32ee0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  n(.            p
32ef0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
32f00 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
32f10 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
32f20 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
32f30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23  ).        );.  #
32f40 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20  else.        rc 
32f50 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
32f60 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32f70 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
32f80 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
32f90 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d    #endif.      }
32fa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
32fb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
32fc0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32fd0 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  fd) );.    }.  .
32fe0 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
32ff0 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
33000 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
33010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
33020 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   open .    ** th
33030 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
33040 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
33050 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
33060 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33070 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
33080 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
33090 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
330a0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ired. */.      p
330b0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
330c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
330d0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
330e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
330f0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
33100 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
33110 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  lHdr = 0;.      
33120 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
33130 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
33140 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
33150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33160 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
33170 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
33180 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
33190 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
331a0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rnal = 0;.  }els
331b0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
331c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
331d0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
331e0 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ED );.    pPager
331f0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
33200 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
33210 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
33220 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
33230 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
33240 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
33250 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
33260 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
33270 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
33280 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
33290 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
332a0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
332b0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
332c0 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
332d0 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
332e0 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
332f0 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
33300 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
33310 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
33320 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
33330 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
33340 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49  st.** an EXCLUSI
33350 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68  VE lock. If such
33360 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61   a lock is alrea
33370 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b  dy held, no lock
33380 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
33390 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64  s need be called
333a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
333b0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
333c0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
333d0 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a  , then any sub-j
333e0 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a  ournal opened.**
333f0 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
33400 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
33410 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
33420 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68  -memory file. Th
33430 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66  is.** has no eff
33440 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a  ect if the sub-j
33450 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64  ournal is alread
33460 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20  y opened (as it 
33470 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72  may be when.** r
33480 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
33490 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20  ive mode) or if 
334a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
334b0 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
334c0 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61   a.** sub-journa
334d0 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  l. If the subjIn
334e0 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
334f0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  is zero, then an
33500 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75  y required.** su
33510 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70  b-journal is imp
33520 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f  lemented in-memo
33530 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20  ry if pPager is 
33540 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
33550 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73  abase, .** or us
33560 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ing a temporary 
33570 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  file otherwise..
33580 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33590 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a  gerBegin(Pager *
335a0 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c  pPager, int exFl
335b0 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65  ag, int subjInMe
335c0 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20  mory){.  int rc 
335d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
335e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
335f0 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61  ode ) return pPa
33600 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
33610 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33620 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
33630 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e  ADER && pPager->
33640 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52  eState<PAGER_ERR
33650 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OR );.  pPager->
33660 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28  subjInMemory = (
33670 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8)subjInMemory;
33680 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
33690 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
336a0 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a  AGER_READER) ){.
336b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
336c0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
336d0 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  0 );..    if( pa
336e0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
336f0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
33700 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f   the pager is co
33710 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
33720 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
33730 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20  lusive, and an. 
33740 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
33750 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
33760 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c  tabase is not al
33770 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
33780 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20  in it now..     
33790 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
337a0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
337b0 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61  ode && sqlite3Wa
337c0 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
337d0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29  Pager->pWal, -1)
337e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
337f0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
33800 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
33810 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
33820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
33840 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
33850 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
33860 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
33870 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
33880 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
33890 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
338a0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
338b0 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
338c0 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
338d0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
338e0 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
338f0 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
33900 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
33910 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
33920 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
33930 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
33940 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
33950 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
33960 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
33970 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
33980 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
33990 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
339a0 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
339b0 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
339c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
339d0 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
339e0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
339f0 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
33a00 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
33a10 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
33a20 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
33a30 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
33a40 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
33a50 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
33a60 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
33a70 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
33a80 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
33a90 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
33aa0 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
33ab0 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
33ac0 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
33ad0 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
33ae0 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
33af0 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
33b00 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
33b10 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
33b20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
33b30 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
33b40 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
33b50 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
33b60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
33b70 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
33b80 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
33b90 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
33ba0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
33bb0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
33bc0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
33bd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33be0 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57    /* Change to W
33bf0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
33c00 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
33c10 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
33c20 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
33c30 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
33c40 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45  _LOCKED or CACHE
33c50 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  MOD.      ** whe
33c60 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e  n it has an open
33c70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
33c80 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44  t never to DBMOD
33c90 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20   or FINISHED..  
33ca0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
33cb0 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20  ecause in those 
33cc0 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  states the code 
33cd0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
33ce0 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
33cf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61   transactions ma
33d00 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  y copy data from
33d10 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
33d20 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
33d30 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  se .      ** fil
33d40 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74  e as well as int
33d50 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
33d60 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
33d70 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20   incorrect in . 
33d80 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
33d90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33da0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
33db0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  = PAGER_WRITER_L
33dc0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61  OCKED;.      pPa
33dd0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
33de0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
33df0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
33e00 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61  dbFileSize = pPa
33e10 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
33e20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
33e30 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
33e40 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
33e50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
33e60 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
33e70 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
33e80 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
33e90 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
33ea0 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73  READER );.    as
33eb0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
33ec0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
33ed0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33ee0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
33ef0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
33f00 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
33f10 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
33f20 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
33f30 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
33f40 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
33f50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
33f60 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
33f70 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
33f80 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
33f90 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
33fa0 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
33fb0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
33fc0 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
33fd0 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
33fe0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
33ff0 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
34000 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
34010 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
34020 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
34030 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
34040 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
34050 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
34060 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
34070 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
34080 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
34090 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
340a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
340b0 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
340c0 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
340d0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
340e0 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
340f0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
34100 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
34110 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
34120 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
34130 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
34140 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
34150 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
34160 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61  y .  ** been sta
34170 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61  rted. The journa
34180 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  l file may or ma
34190 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74  y not be open at
341a0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
341b0 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61  * It is never ca
341c0 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f  lled in the ERRO
341d0 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  R state..  */.  
341e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
341f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
34200 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
34210 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
34220 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
34230 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
34240 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
34250 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
34260 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
34270 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
34280 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
34290 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  r) );..  /* If a
342a0 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  n error has been
342b0 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65   previously dete
342c0 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65  cted, report the
342d0 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a   same error.  **
342e0 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f   again. This sho
342f0 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20  uld not happen, 
34300 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70 72  but the check pr
34310 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73  ovides robustnes
34320 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
34330 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
34340 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61  e) )  return pPa
34350 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
34360 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c   /* Higher-level
34370 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20   routines never 
34380 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
34390 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69  on if database i
343a0 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61  s not.  ** writa
343b0 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20  ble.  But check 
343c0 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72  anyway, just for
343d0 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
343e0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
343f0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20  er->readOnly) ) 
34400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
34410 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  RM;..  CHECK_PAG
34420 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68  E(pPg);..  /* Th
34430 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
34440 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65  eeds to be opene
34450 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20  d. Higher level 
34460 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c  routines have al
34470 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69  ready.  ** obtai
34480 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  ned the necessar
34490 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e  y locks to begin
344a0 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
344b0 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a  action, but the.
344c0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f    ** rollback jo
344d0 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
344e0 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65  yet be open. Ope
344f0 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73  n it now if this
34500 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
34510 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
34520 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  done before call
34530 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
34540 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20  eMakeDirty() on 
34550 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20  the page. .  ** 
34560 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74  Otherwise, if it
34570 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72   were done after
34580 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
34590 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
345a0 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20  ), then.  ** an 
345b0 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75  error might occu
345c0 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  r and the pager 
345d0 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20  would end up in 
345e0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
345f0 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61  ate.  ** with pa
34600 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69  ges marked as di
34610 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  rty in the cache
34620 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
34630 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
34640 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
34650 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
34660 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
34670 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
34680 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34690 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
346a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
346b0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
346c0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
346d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
346e0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
346f0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
34700 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
34710 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
34720 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
34730 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
34740 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
34750 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
34760 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
34770 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
34780 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
34790 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65  pPg);.  if( page
347a0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
347b0 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  & !subjRequiresP
347c0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
347d0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
347e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
347f0 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
34800 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
34810 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
34820 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
34830 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
34840 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
34850 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
34860 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
34870 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
34880 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
34890 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
348a0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
348b0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
348c0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
348d0 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
348e0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
348f0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
34900 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
34910 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
34920 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
34930 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
34940 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
34950 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65  rigSize && isOpe
34960 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
34970 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
34980 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
34990 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20  r *pData2;.     
349a0 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50     i64 iOff = pP
349b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
349c0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
349d0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
349e0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
349f0 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
34a00 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
34a10 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
34a20 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
34a30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
34a40 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
34a50 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
34a60 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
34a70 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
34a80 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
34a90 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
34aa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34ab0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
34ac0 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
34ad0 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  nalOff );.      
34ae0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
34af0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
34b00 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
34b10 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
34b20 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
34b30 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
34b40 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
34b50 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ta2);..        /
34b60 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
34b70 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
34b80 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a  r occurs while j
34b90 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
34ba0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
34bb0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
34bc0 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
34bd0 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
34be0 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
34bf0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
34c00 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
34c10 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
34c20 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
34c30 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
34c40 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
34c50 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
34c60 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
34c70 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
34c80 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
34c90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
34ca0 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
34cb0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
34cc0 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
34cd0 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
34ce0 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
34cf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
34d00 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
34d10 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
34d20 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ..        rc = w
34d30 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
34d40 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50  r->jfd, iOff, pP
34d50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
34d60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34d70 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
34d80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34d90 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
34da0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
34db0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
34dc0 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20  ze, iOff+4);.   
34dd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34de0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
34df0 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
34e00 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
34e10 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70  ger->jfd, iOff+p
34e20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
34e30 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  4, cksum);.     
34e40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34e50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
34e60 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ;..        IOTRA
34e70 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
34e80 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
34e90 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
34ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34eb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
34ec0 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
34ed0 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
34ee0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
34ef0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
34f00 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
34f10 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
34f20 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
34f30 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
34f40 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
34f50 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
34f60 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
34f70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
34f80 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
34f90 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
34fa0 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
34fb0 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
34fc0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
34fd0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b  ournalOff += 8 +
34fe0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
34ff0 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
35000 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
35010 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
35020 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
35030 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
35040 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
35050 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
35060 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
35070 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
35080 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
35090 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
350a0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
350b0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
350c0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
350d0 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
350e0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
350f0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
35100 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
35110 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
35120 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
35130 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
35140 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
35150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
35170 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
35180 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
35190 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
351a0 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OD ){.          
351b0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
351c0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
351d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
351e0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50   PAGERTRACE(("AP
351f0 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
35200 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
35210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35220 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
35230 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
35240 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
35250 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
35260 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b  ED_SYNC)?1:0)));
35270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35280 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
35290 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
352a0 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
352b0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
352c0 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
352d0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
352e0 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
352f0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
35300 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
35310 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
35320 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
35330 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
35340 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
35350 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
35360 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
35370 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
35380 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
35390 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
353a0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
353b0 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pPg) ){.      rc
353c0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
353d0 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
353e0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
353f0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
35400 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
35410 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
35420 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
35430 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
35440 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
35450 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
35460 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
35470 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
35480 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
35490 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
354a0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
354b0 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
354c0 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
354d0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
354e0 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
354f0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
35500 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
35510 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
35520 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
35530 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
35540 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
35550 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
35560 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
35570 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
35580 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
35590 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
355a0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
355b0 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
355c0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
355d0 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
355e0 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
355f0 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
35600 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
35610 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
35620 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
35630 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
35640 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
35650 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
35660 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
35670 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
35680 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
35690 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
356a0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
356b0 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
356c0 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
356d0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
356e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
356f0 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
35700 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
35710 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35720 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
35730 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
35740 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
35750 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
35760 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
35770 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
35780 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
35790 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72  eSize);..  asser
357a0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
357b0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
357c0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
357d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
357e0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
357f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
35800 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
35810 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
35820 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ( nPagePerSector
35830 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
35840 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
35850 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
35860 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
35870 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
35880 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
35890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
358a0 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
358b0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
358c0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
358d0 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  .    int nPage =
358e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
358f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
35900 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
35910 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
35920 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
35930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35940 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
35950 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
35960 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  c = 0;         /
35970 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
35980 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45  ge has PGHDR_NEE
35990 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f  D_SYNC */..    /
359a0 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
359b0 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f  yncSpill flag to
359c0 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
359d0 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
359e0 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75  low.    ** a jou
359f0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62  rnal header to b
35a00 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
35a10 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
35a20 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  naled by.    ** 
35a30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  this function.. 
35a40 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
35a50 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
35a60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35a70 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d  doNotSyncSpill==
35a80 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
35a90 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b  >doNotSyncSpill+
35aa0 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  +;..    /* This 
35ab0 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
35ac0 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
35ad0 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
35ae0 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
35af0 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
35b00 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
35b10 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
35b20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
35b30 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
35b40 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
35b50 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
35b60 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
35b70 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
35b80 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
35b90 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
35ba0 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43  + 1;..    nPageC
35bb0 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64  ount = pPager->d
35bc0 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70  bSize;.    if( p
35bd0 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
35be0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
35bf0 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
35c00 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
35c10 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
35c20 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
35c30 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
35c40 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
35c50 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
35c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
35c70 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
35c80 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
35c90 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
35ca0 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
35cb0 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
35cc0 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
35cd0 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
35ce0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
35cf0 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
35d00 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
35d10 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
35d20 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
35d30 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
35d40 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
35d50 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
35d60 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
35d70 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
35d80 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
35d90 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
35da0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
35db0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
35dc0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
35dd0 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
35de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
35df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35e00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
35e10 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
35e20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
35e30 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
35e40 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
35e50 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
35e60 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
35e70 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
35e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
35e90 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
35ea0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
35eb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
35ec0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50     }else if( (pP
35ed0 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
35ee0 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21  up(pPager, pg))!
35ef0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
35f00 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
35f10 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
35f20 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
35f30 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
35f40 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
35f50 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
35f60 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
35f70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
35f80 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
35f90 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  NC flag is set f
35fa0 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50  or any of the nP
35fb0 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
35fc0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  * starting at pg
35fd0 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73  1, then it needs
35fe0 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61   to be set for a
35ff0 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61  ll of them. Beca
36000 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69  use.    ** writi
36010 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ng to any of the
36020 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d  se nPage pages m
36030 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74  ay damage the ot
36040 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a  hers, the.    **
36050 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
36060 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28  st contain sync(
36070 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c  )ed copies of al
36080 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  l of them.    **
36090 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74   before any of t
360a0 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74  hem can be writt
360b0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
360c0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
360d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
360e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65  SQLITE_OK && nee
360f0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61  dSync ){.      a
36100 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
36110 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
36120 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29   ii<nPage; ii++)
36130 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
36140 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  *pPage = pager_l
36150 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
36160 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69  1+ii);.        i
36170 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
36180 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61        pPage->fla
36190 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
361a0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
361b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
361c0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
361d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
361e0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
361f0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
36200 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20  cSpill==1 );.   
36210 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
36220 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c  ncSpill--;.  }el
36230 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
36240 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
36250 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
36260 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
36270 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
36280 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
36290 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
362a0 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
362b0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
362c0 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
362d0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
362e0 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
362f0 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
36300 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
36310 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
36320 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
36330 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
36340 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
36350 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
36360 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
36370 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66  _DIRTY;.}.#endif
36380 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
36390 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
363a0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
363b0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
363c0 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
363d0 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
363e0 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ion on page pPg 
363f0 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
36400 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
36410 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
36420 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
36430 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65  rty.  This happe
36440 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
36450 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67   when.** the pag
36460 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64  e has been added
36470 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68   as a leaf of th
36480 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73  e freelist and s
36490 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o its.** content
364a0 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65   no longer matte
364b0 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  rs..**.** The ov
364c0 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
364d0 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
364e0 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
364f0 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
36500 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
36510 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54  age is unused. T
36520 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
36530 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
36540 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
36550 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
36560 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
36570 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
36580 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
36590 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70  tion can quadrup
365a0 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
365b0 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45  large .** DELETE
365c0 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
365d0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
365e0 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72  rDontWrite(PgHdr
365f0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
36600 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
36610 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50  Pager;.  if( (pP
36620 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
36630 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d  IRTY) && pPager-
36640 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  >nSavepoint==0 )
36650 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
36660 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  (("DONT_WRITE pa
36670 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
36680 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
36690 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
366a0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
366b0 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
366c0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
366d0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
366e0 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  = PGHDR_DONT_WRI
366f0 54 45 3b 0a 20 20 20 20 70 61 67 65 72 5f 73 65  TE;.    pager_se
36700 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
36710 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
36720 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
36730 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
36740 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
36750 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36760 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e   .** change-coun
36770 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ter, stored as a
36780 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
36790 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74  an integer start
367a0 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20  ing at .** byte 
367b0 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
367c0 20 70 61 67 65 72 20 66 69 6c 65 2e 20 20 54 68   pager file.  Th
367d0 65 20 73 65 63 6f 6e 64 61 72 79 20 63 68 61 6e  e secondary chan
367e0 67 65 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a  ge counter at.**
367f0 20 39 32 20 69 73 20 61 6c 73 6f 20 75 70 64 61   92 is also upda
36800 74 65 64 2c 20 61 73 20 69 73 20 74 68 65 20 53  ted, as is the S
36810 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
36820 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39  mber at offset 9
36830 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69  6..**.** But thi
36840 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  s only happens i
36850 66 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68  f the pPager->ch
36860 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
36870 61 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20  ag is false..** 
36880 54 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73 20  To avoid excess 
36890 63 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67 65  churning of page
368a0 20 31 2c 20 74 68 65 20 75 70 64 61 74 65 20 6f   1, the update o
368b0 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65  nly happens once
368c0 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68  ..** See also th
368d0 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  e pager_write_ch
368e0 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 72 6f  angecounter() ro
368f0 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
36900 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69  an .** unconditi
36910 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f 66 20 74  onal update of t
36920 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
36930 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
36940 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
36950 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  ag is zero, then
36960 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79   this is done by
36970 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c   calling .** sql
36980 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
36990 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e   on page 1, then
369a0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
369b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
369c0 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20  * page data. In 
369d0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69  this case the fi
369e0 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74  le will be updat
369f0 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ed when the curr
36a00 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
36a10 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
36a20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72  .**.** The isDir
36a30 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79  ectMode flag may
36a40 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72   only be non-zer
36a50 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79  o if the library
36a60 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a   was compiled.**
36a70 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
36a80 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
36a90 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e  RITE macro defin
36aa0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
36ab0 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74  ,.** if isDirect
36ac0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
36ad0 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
36ae0 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
36af0 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77  directly.** by w
36b00 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65  riting an update
36b10 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  d version of pag
36b20 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  e 1 using a call
36b30 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   to the .** sqli
36b40 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e  te3OsWrite() fun
36b50 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
36b60 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
36b70 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
36b80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
36b90 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a   isDirectMode){.
36ba0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36bb0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
36bc0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36bd0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
36be0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
36bf0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36c00 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
36c10 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
36c20 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
36c30 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
36c40 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61  ..  /* Declare a
36c50 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  nd initialize co
36c60 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27  nstant integer '
36c70 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68  isDirect'. If th
36c80 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72  e.  ** atomic-wr
36c90 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
36ca0 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74   is enabled in t
36cb0 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  his build, then 
36cc0 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73  isDirect.  ** is
36cd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
36ce0 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
36cf0 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74   as the isDirect
36d00 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20  Mode parameter. 
36d10 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63   ** to this func
36d20 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
36d30 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65   it is always se
36d40 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  t to zero..  **.
36d50 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73    ** The idea is
36d60 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f   that if the ato
36d70 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
36d80 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  zation is not.  
36d90 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ** enabled at co
36da0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20  mpile time, the 
36db0 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69  compiler can omi
36dc0 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20  t the tests of. 
36dd0 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62   ** 'isDirect' b
36de0 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73  elow, as well as
36df0 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f   the block enclo
36e00 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  sed in the.  ** 
36e10 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22  "if( isDirect )"
36e20 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f   condition..  */
36e30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36e40 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
36e50 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52  ITE.# define DIR
36e60 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73  ECT_MODE 0.  ass
36e70 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64  ert( isDirectMod
36e80 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  e==0 );.  UNUSED
36e90 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72  _PARAMETER(isDir
36ea0 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  ectMode);.#else.
36eb0 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
36ec0 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64  MODE isDirectMod
36ed0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
36ee0 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
36ef0 6f 75 6e 74 44 6f 6e 65 20 26 26 20 41 4c 57 41  ountDone && ALWA
36f00 59 53 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  YS(pPager->dbSiz
36f10 65 3e 30 29 20 29 7b 0a 20 20 20 20 50 67 48 64  e>0) ){.    PgHd
36f20 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20  r *pPgHdr;      
36f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66            /* Ref
36f40 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
36f50 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
36f60 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
36f70 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  le && isOpen(pPa
36f80 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20  ger->fd) );..   
36f90 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
36fa0 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
36fb0 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
36fc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36fd0 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
36fe0 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73  &pPgHdr);.    as
36ff0 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20  sert( pPgHdr==0 
37000 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
37010 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
37020 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63  age one was fetc
37030 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  hed successfully
37040 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
37050 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  ion is not.    *
37060 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64  * operating in d
37070 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65  irect-mode, make
37080 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65   page 1 writable
37090 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a  .  When not in .
370a0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f      ** direct mo
370b0 64 65 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c  de, page 1 is al
370c0 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63  ways held in cac
370d0 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65  he and hence the
370e0 20 50 61 67 65 72 47 65 74 28 29 0a 20 20 20 20   PagerGet().    
370f0 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61  ** above is alwa
37100 79 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20  ys successful - 
37110 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53  hence the ALWAYS
37120 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   on rc==SQLITE_O
37130 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  K..    */.    if
37140 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26  ( !DIRECT_MODE &
37150 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c  & ALWAYS(rc==SQL
37160 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  ITE_OK) ){.     
37170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37180 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
37190 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
371a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
371b0 0a 20 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c  .      /* Actual
371c0 6c 79 20 64 6f 20 74 68 65 20 75 70 64 61 74 65  ly do the update
371d0 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20 63   of the change c
371e0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
371f0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
37200 67 65 63 6f 75 6e 74 65 72 28 70 50 67 48 64 72  gecounter(pPgHdr
37210 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
37220 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63  running in direc
37230 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68  t mode, write th
37240 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  e contents of pa
37250 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65  ge 1 to the file
37260 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44  . */.      if( D
37270 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20  IRECT_MODE ){.  
37280 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
37290 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20   *zBuf;.        
372a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
372b0 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a  dbFileSize>0 );.
372c0 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70          CODEC2(p
372d0 50 61 67 65 72 2c 20 70 50 67 48 64 72 2d 3e 70  Pager, pPgHdr->p
372e0 44 61 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53  Data, 1, 6, rc=S
372f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75  QLITE_NOMEM, zBu
37300 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
37310 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37320 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
37330 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
37340 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
37350 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
37360 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
37370 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
37380 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
37390 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
373a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
373b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
373c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
373d0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
373e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
373f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37400 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
37410 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
37420 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
37430 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
37440 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
37450 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
37460 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
37470 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37480 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
37490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
374a0 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73  le to disk. This
374b0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
374c0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
374d0 73 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20  ses.** or pages 
374e0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e  with the Pager.n
374f0 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a  oSync flag set..
37500 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
37510 66 75 6c 2c 20 6f 72 20 69 66 20 63 61 6c 6c 65  ful, or if calle
37520 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72  d on a pager for
37530 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e   which it is a n
37540 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75  o-op, this.** fu
37550 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
37560 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
37570 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  ise, an IO error
37580 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
37590 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
375a0 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72  3PagerSync(Pager
375b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
375c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
375d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
375e0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
375f0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
37600 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37610 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
37620 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
37630 6c 61 67 73 29 3b 0a 20 20 7d 65 6c 73 65 20 69  lags);.  }else i
37640 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
37650 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
37660 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
37670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
37680 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
37690 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
376a0 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54  FCNTL_SYNC_OMITT
376b0 45 44 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ED, 0);.    if( 
376c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
376d0 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  UND ){.      rc 
376e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
376f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
37700 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
37710 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
37720 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
37730 69 6c 65 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ile a write-tran
37740 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
37750 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  e in.** rollback
37760 2e 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  . If the connect
37770 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f  ion is in WAL mo
37780 64 65 2c 20 74 68 69 73 20 63 61 6c 6c 20 69 73  de, this call is
37790 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74   a no-op. .** Ot
377a0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
377b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20  connection does 
377c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 61 76 65  not already have
377d0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
377e0 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61  ck on .** the da
377f0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 20  tabase file, an 
37800 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
37810 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a  to obtain one..*
37820 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 43 4c  *.** If the EXCL
37830 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c  USIVE lock is al
37840 72 65 61 64 79 20 68 65 6c 64 20 6f 72 20 74 68  ready held or th
37850 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  e attempt to obt
37860 61 69 6e 20 69 74 20 69 73 0a 2a 2a 20 73 75 63  ain it is.** suc
37870 63 65 73 73 66 75 6c 2c 20 6f 72 20 74 68 65 20  cessful, or the 
37880 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
37890 20 57 41 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54   WAL mode, SQLIT
378a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
378b0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
378c0 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 42 55  either SQLITE_BU
378d0 53 59 20 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  SY or an SQLITE_
378e0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
378f0 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
37900 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
37910 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
37920 76 65 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  veLock(Pager *pP
37930 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
37940 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
37950 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37960 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37970 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20  TER_CACHEMOD .  
37980 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
37990 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
379a0 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20  ITER_DBMOD .    
379b0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
379c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
379d0 45 52 5f 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a  ER_LOCKED .  );.
379e0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
379f0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
37a00 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20 30 3d  ger) );.  if( 0=
37a10 3d 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  =pagerUseWal(pPa
37a20 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ger) ){.    rc =
37a30 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
37a40 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
37a50 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  USIVE_LOCK);.  }
37a60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37a70 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
37a80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
37a90 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
37aa0 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
37ab0 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
37ac0 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
37ad0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
37ae0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
37af0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
37b00 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
37b10 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
37b20 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
37b30 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
37b40 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
37b50 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
37b60 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
37b70 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
37b80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
37b90 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ures that:.**.**
37ba0 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
37bb0 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
37bc0 75 6e 74 65 72 20 69 73 20 75 70 64 61 74 65 64  unter is updated
37bd0 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75  ,.**   * the jou
37be0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28  rnal is synced (
37bf0 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69  unless the atomi
37c00 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
37c10 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a  tion is used),.*
37c20 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20  *   * all dirty 
37c30 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
37c40 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
37c50 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20  e file, .**   * 
37c60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37c70 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 28  e is truncated (
37c80 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e  if required), an
37c90 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  d.**   * the dat
37ca0 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
37cb0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  d. .**.** The on
37cc0 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 72 65  ly thing that re
37cd0 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
37ce0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
37cf0 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a  is to finalize .
37d00 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e  ** (delete, trun
37d10 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
37d20 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 29 20   first part of) 
37d30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37d40 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20   (or .** delete 
37d50 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
37d60 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
37d70 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
37d80 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
37d90 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
37da0 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
37db0 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
37dc0 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
37dd0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
37de0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
37df0 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  all..**.** If th
37e00 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
37e10 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20  r - noSync - is 
37e20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
37e30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
37e40 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79  elf.** is not sy
37e50 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  nced. The caller
37e60 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74   must call sqlit
37e70 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69  e3PagerSync() di
37e80 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e  rectly to.** syn
37e90 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
37ea0 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
37eb0 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  ng CommitPhaseTw
37ec0 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68  o() to delete th
37ed0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
37ee0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
37ef0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37f00 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
37f10 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
37f20 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
37f30 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
37f40 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
37f50 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20  char *zMaster,  
37f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
37f70 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61  not NULL, the ma
37f80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
37f90 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e  e */.  int noSyn
37fa0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
37fb0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
37fc0 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63  o omit the xSync
37fd0 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
37fe0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
37ff0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
38000 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
38010 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
38020 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
38030 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
38040 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
38050 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
38060 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
38070 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
38080 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
38090 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
380a0 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
380b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
380c0 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
380d0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
380e0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
380f0 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  ager) );..  /* I
38100 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
38110 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74  occurred, report
38120 20 74 68 61 74 20 65 72 72 6f 72 20 61 67 61 69   that error agai
38130 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  n. */.  if( NEVE
38140 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
38150 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
38160 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
38170 50 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54  PAGERTRACE(("DAT
38180 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
38190 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
381a0 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  Size=%d\n", .   
381b0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
381c0 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70  name, zMaster, p
381d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b  Pager->dbSize));
381e0 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74  ..  /* If no dat
381f0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 68 61  abase changes ha
38200 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 72 65  ve been made, re
38210 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20  turn early. */. 
38220 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
38230 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
38240 5f 43 41 43 48 45 4d 4f 44 20 29 20 72 65 74 75  _CACHEMOD ) retu
38250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
38260 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
38270 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
38280 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
38290 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
382a0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
382b0 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a  o, or this.    *
382c0 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
382d0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
382e0 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79  ed, it is mostly
382f0 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76   a no-op.  Howev
38300 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62  er, any.    ** b
38310 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73  ackup in progres
38320 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
38330 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  started..    */.
38340 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
38350 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
38360 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c  >pBackup);.  }el
38370 73 65 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65  se{.    if( page
38380 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
38390 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
383a0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
383b0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
383c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
383d0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
383e0 61 67 65 4f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ageOne = 0;.    
383f0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
38400 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  {.        /* Mus
38410 74 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20  t have at least 
38420 6f 6e 65 20 70 61 67 65 20 66 6f 72 20 74 68 65  one page for the
38430 20 57 41 4c 20 63 6f 6d 6d 69 74 20 66 6c 61 67   WAL commit flag
38440 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 69 63  ..        ** Tic
38450 6b 65 74 20 5b 32 64 31 61 35 63 36 37 64 66 63  ket [2d1a5c67dfc
38460 32 33 36 33 65 34 34 66 32 39 64 39 62 62 64 35  2363e44f29d9bbd5
38470 37 66 5d 20 32 30 31 31 2d 30 35 2d 31 38 20 2a  7f] 2011-05-18 *
38480 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
38490 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
384a0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65  Pager, 1, &pPage
384b0 4f 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  One);.        pL
384c0 69 73 74 20 3d 20 70 50 61 67 65 4f 6e 65 3b 0a  ist = pPageOne;.
384d0 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
384e0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
384f0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
38500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
38510 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
38520 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
38530 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
38540 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
38550 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e   pList, pPager->
38560 64 62 53 69 7a 65 2c 20 31 29 3b 0a 20 20 20 20  dbSize, 1);.    
38570 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
38580 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
38590 65 4f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  eOne);.      if(
385a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
385b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
385c0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
385d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
385e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
385f0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
38600 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
38610 6b 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  k updates the ch
38620 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78  ange-counter. Ex
38630 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20  actly how it.   
38640 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20     ** does this 
38650 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
38660 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
38670 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69  omic-update opti
38680 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  mization.      *
38690 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74  * was enabled at
386a0 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61   compile time, a
386b0 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e 73  nd if this trans
386c0 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65  action meets the
386d0 20 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e 74 69   .      ** runti
386e0 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20 75  me criteria to u
386f0 73 65 20