/ Hex Artifact Content
Login

Artifact 3955b62cdb5bb64559607cb474dd12a6c8e1d4a5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
7100: 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75  l if true */.  u
7110: 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20  8 fullSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
7130: 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20   extra syncs of 
7140: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
7150: 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20  robustness */.  
7160: 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  u8 ckptSyncFlags
7170: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7180: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
7190: 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63  NC_FULL for chec
71a0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77  kpoint */.  u8 w
71b0: 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  alSyncFlags;    
71c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
71d0: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
71e0: 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74  ULL for wal writ
71f0: 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46  es */.  u8 syncF
7200: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7210: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7220: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7230: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
7240: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
7250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
7260: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
7270: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
7280: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
72a0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
72b0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
72c0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72e0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
72f0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
7300: 2f 0a 0a 20 20 2f 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 2a 2a 2a 2a  ****************
7350: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7360: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7370: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7380: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7390: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
73a0: 6f 75 74 69 6e 65 20 6f 70 65 72 74 69 6f 6e 2e  outine opertion.
73b0: 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73 20    Class members 
73c0: 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f 63  not in this bloc
73d0: 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69 78  k are either fix
73e0: 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  ed.  ** when the
73f0: 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74 20   pager is first 
7400: 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65 20  created or else 
7410: 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65 6e  only change when
7420: 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a 2a   there is a.  **
7430: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f 64   significant mod
7440: 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20 61  e change (such a
7450: 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 70  s changing the p
7460: 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e  age_size, lockin
7470: 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72 20  g_mode,.  ** or 
7480: 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  the journal_mode
7490: 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72  ).  From another
74a0: 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c 61   view, these cla
74b0: 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72  ss members descr
74c0: 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73 74  ibe.  ** the "st
74d0: 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67 65  ate" of the page
74e0: 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20 63  r, while other c
74f0: 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73  lass members des
7500: 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20 22  cribe the.  ** "
7510: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 6f  configuration" o
7520: 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  f the pager..  *
7530: 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20 20  /.  u8 eState;  
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7550: 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20 28  /* Pager state (
7560: 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57 52  OPEN, READER, WR
7570: 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a  ITER_LOCKED..) *
7580: 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20  /.  u8 eLock;   
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20  /* Current lock 
75b0: 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73 65  held on database
75c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63 68   file */.  u8 ch
75d0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20  angeCountDone;  
75e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66         /* Set af
75f0: 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ter incrementing
7600: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
7610: 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  ter */.  u8 setM
7620: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
7630: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7640: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
7650: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
7660: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
7670: 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20 20  tSpill;         
7680: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7690: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 77  pill the cache w
76a0: 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a  hen non-zero */.
76b0: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 53 70    u8 doNotSyncSp
76c0: 69 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ill;          /*
76d0: 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 73 70 69   Do not do a spi
76e0: 6c 6c 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ll that requires
76f0: 20 6a 72 6e 6c 20 73 79 6e 63 20 2a 2f 0a 20 20   jrnl sync */.  
7700: 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8 subjInMemory;
7710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7720: 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65  rue to use in-me
7730: 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
7740: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69  s */.  Pgno dbSi
7750: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7760: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7770: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7780: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
7790: 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20 20  dbOrigSize;     
77a0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
77b0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
77c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
77d0: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c 65  */.  Pgno dbFile
77e0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
7800: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
7810: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
7820: 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b 20 20  no dbHintSize;  
7830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
7840: 75 65 20 70 61 73 73 65 64 20 74 6f 20 46 43 4e  ue passed to FCN
7850: 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63 61 6c  TL_SIZE_HINT cal
7860: 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  l */.  int errCo
7870: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
7880: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
7890: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
78a0: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rors */.  int nR
78b0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
78c0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6a        /* Pages j
78d0: 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20  ournalled since 
78e0: 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77 72  last j-header wr
78f0: 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63  itten */.  u32 c
7900: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
7910: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
7920: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
7930: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
7940: 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53  ksum */.  u32 nS
7950: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
7960: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7970: 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74 74  of records writt
7980: 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61  en to sub-journa
7990: 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  l */.  Bitvec *p
79a0: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
79b0: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
79c0: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
79d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
79e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
79f0: 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20 20  le *fd;         
7a00: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a10: 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61 73  ptor for databas
7a20: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
7a30: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
7a40: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a50: 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a  iptor for main j
7a60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
7a70: 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20  te3_file *sjfd; 
7a80: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
7a90: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 73  descriptor for s
7aa0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7ab0: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7ad0: 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66 66  urrent write off
7ae0: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
7af0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
7b00: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
7b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
7b20: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
7b30: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
7b40: 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
7b50: 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b  backup *pBackup;
7b60: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
7b70: 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e  o list of ongoin
7b80: 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  g backup process
7b90: 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76  es */.  PagerSav
7ba0: 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69  epoint *aSavepoi
7bb0: 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  nt; /* Array of 
7bc0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
7bd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65  s */.  int nSave
7be0: 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  point;          
7bf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7c00: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76  elements in aSav
7c10: 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68  epoint[] */.  ch
7c20: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7c30: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7c40: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7c50: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7c60: 67 65 73 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ges */.  /*.  **
7c70: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
7c80: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
7c90: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass 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 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
7cf0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
7d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7d10: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
7d20: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
7d30: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
7d40: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
7d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7d60: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
7d70: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
7d80: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
7d90: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
7da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
7db0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
7dc0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
7dd0: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
7de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
7df0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
7e00: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
7e10: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
7e20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7e30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7e40: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
7e50: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
7e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e70: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
7e80: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
7e90: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
7ea0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
7eb0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
7ec0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
7ed0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
7ee0: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
7ef0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
7f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7f10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7f20: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
7f30: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7f40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
7f50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7f60: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
7f70: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
7f80: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
7f90: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
7fa0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
7fb0: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
7fc0: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
7fd0: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
7fe0: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  dler */.  int nH
7ff0: 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20  it, nMiss;      
8000: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
8010: 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69  ache hits and mi
8020: 73 73 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  sses */.#ifdef S
8030: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
8040: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
8050: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
8060: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
8070: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
8080: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8090: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
80a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
80b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
80c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
80d0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
80e0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
80f0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
8100: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
8110: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
8120: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
8130: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8140: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8150: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8160: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8170: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8180: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8190: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
81a0: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
81b0: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
81c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
81d0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
81e0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
81f0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
8200: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
8210: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
8220: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
8230: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
8240: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8250: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8260: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8270: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8280: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8290: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
82a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
82b0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
82c0: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
82d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
82e0: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
82f0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
8300: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
8310: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
8320: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
8330: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
8340: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8350: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f.};../*.** The 
8360: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
8370: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
8380: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
8390: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
83a0: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
83b0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
83c0: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
83d0: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
83e0: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
83f0: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
8400: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
8410: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8420: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
8430: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
8440: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
8450: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
8460: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
8470: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
8480: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
8490: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
84a0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
84b0: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
84c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
84d0: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
84e0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
84f0: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
8500: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
8510: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
8520: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
8530: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
8540: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
8550: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
8560: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
8570: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
8580: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
8590: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
85a0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
85b0: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
85c0: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
85d0: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
85e0: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
85f0: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
8600: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
8610: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
8620: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
8630: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
8640: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
8650: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
8660: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a  urnal is being.*
8670: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
8680: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
8690: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
86a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
86b0: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
86c0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
86d0: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
86e0: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
86f0: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
8700: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
8710: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
8720: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
8730: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
8740: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
8750: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
8760: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
8770: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
8780: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
8790: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
87a0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
87b0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
87c0: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
87d0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
87e0: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
87f0: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
8800: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
8810: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
8820: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
8830: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
8840: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
8850: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
8860: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
8870: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
8880: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
8890: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
88a0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
88b0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
88c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
88d0: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
88e0: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
88f0: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
8900: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
8910: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
8920: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
8930: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
8940: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
8950: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
8960: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
8970: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
8980: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
8990: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
89a0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
89b0: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
89c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
89d0: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
89e0: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
89f0: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
8a00: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
8a10: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
8a20: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
8a30: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
8a40: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
8a50: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
8a60: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
8a70: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
8a80: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
8a90: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
8aa0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
8ab0: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
8ac0: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
8ad0: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
8ae0: 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  he of each page 
8af0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
8b00: 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62  urnal is given b
8b10: 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y.** the followi
8b20: 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65  ng macro..*/.#de
8b30: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
8b40: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
8b50: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
8b60: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
8b70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
8b80: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
8b90: 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  er. This is usua
8ba0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  lly the same .**
8bb0: 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c   size as a singl
8bc0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
8bd0: 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f  ee also setSecto
8be0: 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  rSize()..*/.#def
8bf0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
8c00: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
8c10: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
8c20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
8c30: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
8c40: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
8c50: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
8c60: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
8c70: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
8c80: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
8c90: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
8ca0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
8cb0: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
8cc0: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
8cd0: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
8ce0: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
8cf0: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
8d00: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
8d10: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
8d20: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
8d30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
8d40: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
8d50: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
8d60: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
8d70: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
8d80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
8d90: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
8da0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
8db0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
8dc0: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
8dd0: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
8de0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
8df0: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
8e00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
8e10: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
8e20: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
8e30: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
8e40: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
8e50: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
8e60: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
8e70: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
8e80: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
8e90: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
8ea0: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
8eb0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
8ec0: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
8ed0: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
8ee0: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
8ef0: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
8f00: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
8f10: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
8f20: 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  hods)../*.** Ret
8f30: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
8f40: 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72   pager uses a wr
8f50: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e  ite-ahead log in
8f60: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
8f70: 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  al.** rollback j
8f80: 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73  ournal. Otherwis
8f90: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e  e false..*/.#ifn
8fa0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8fb0: 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70  WAL.static int p
8fc0: 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72  agerUseWal(Pager
8fd0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
8fe0: 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61  urn (pPager->pWa
8ff0: 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  l!=0);.}.#else.#
9000: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9010: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
9020: 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  e pagerRollbackW
9030: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9040: 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
9050: 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66  v,w,x,y) 0.# def
9060: 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  ine pagerOpenWal
9070: 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c  IfPresent(z) SQL
9080: 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20  ITE_OK.# define 
9090: 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
90a0: 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c  ansaction(z) SQL
90b0: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23  ITE_OK.#endif..#
90c0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
90d0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
90e0: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
90f0: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
9100: 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  Pager) );.**.** 
9110: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75  This function ru
9120: 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20  ns many asserts 
9130: 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69  to try to find i
9140: 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69  nconsistencies i
9150: 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61  n.** the interna
9160: 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  l state of the P
9170: 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ager object..*/.
9180: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
9190: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
91a0: 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72  ger *p){.  Pager
91b0: 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20   *pPager = p;.. 
91c0: 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62   /* State must b
91d0: 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73  e valid. */.  as
91e0: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d  sert( p->eState=
91f0: 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20  =PAGER_OPEN.    
9200: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9210: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20  =PAGER_READER.  
9220: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9230: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9240: 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
9250: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9260: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
9270: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9280: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9290: 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
92a0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
92b0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
92c0: 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  SHED.       || p
92d0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
92e0: 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ERROR.  );..  /*
92f0: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
9300: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
9310: 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f  , a temp-file co
9320: 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nnection always 
9330: 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20  behaves.  ** as 
9340: 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63  if it has an exc
9350: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
9360: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9370: 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74  . It never updat
9380: 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e  es.  ** the chan
9390: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
93a0: 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43  , so the changeC
93b0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
93c0: 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a   always set..  *
93d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  /.  assert( p->t
93e0: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d  empFile==0 || p-
93f0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
9400: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
9410: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9420: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68  =0 || pPager->ch
9430: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b  angeCountDone );
9440: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
9450: 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  eJournal flag is
9460: 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72   clear, the jour
9470: 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65  nal-mode must be
9480: 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e   "OFF". .  ** An
9490: 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d if the journal
94a0: 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20  -mode is "OFF", 
94b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
94c0: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65   must not be ope
94d0: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
94e0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
94f0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9500: 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73  ODE_OFF || p->us
9510: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
9520: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9530: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
9540: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21  NALMODE_OFF || !
9550: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29  isOpen(p->jfd) )
9560: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
9570: 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73  at MEMDB implies
9580: 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20   noSync. And an 
9590: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
95a0: 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74  l. Since .  ** t
95b0: 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d  his means an in-
95c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72  memory pager per
95d0: 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61  forms no IO at a
95e0: 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e  ll, it cannot en
95f0: 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69  counter .  ** ei
9600: 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
9610: 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  R or SQLITE_FULL
9620: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
9630: 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69   or while finali
9640: 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75  zing .  ** a jou
9650: 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68  rnal file. (alth
9660: 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ough the in-memo
9670: 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65  ry journal imple
9680: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20  mentation may . 
9690: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
96a0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68  E_IOERR_NOMEM wh
96b0: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
96c0: 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72  file is being wr
96d0: 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a  itten). It .  **
96e0: 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f   is therefore no
96f0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
9700: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
9710: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
9720: 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65  RROR .  ** state
9730: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
9740: 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
9750: 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ( p->noSync );. 
9760: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f     assert( p->jo
9770: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9780: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9790: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
97a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
97b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
97c0: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20  MEMORY .    );. 
97d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53     assert( p->eS
97e0: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
97f0: 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d  R && p->eState!=
9800: 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
9810: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
9820: 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20  seWal(p)==0 );. 
9830: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e   }..  /* If chan
9840: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73  geCountDone is s
9850: 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c  et, a RESERVED l
9860: 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
9870: 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a  ust be held.  **
9880: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   on the file..  
9890: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
98a0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
98b0: 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Done==0 || pPage
98c0: 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  r->eLock>=RESERV
98d0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
98e0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50  ert( p->eLock!=P
98f0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a  ENDING_LOCK );..
9900: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74    switch( p->eSt
9910: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
9920: 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20  PAGER_OPEN:.    
9930: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
9940: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9950: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9960: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
9980: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
9990: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
99a0: 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65  che)==0 || pPage
99b0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
99c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
99d0: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44   case PAGER_READ
99e0: 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ER:.      assert
99f0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9a00: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9a10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9a20: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
9a30: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9a40: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9a50: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
9a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9a70: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
9a80: 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20  ER_LOCKED:.     
9a90: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9aa0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9ab0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9ac0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9ad0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9ae0: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
9af0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
9b00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9b10: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
9b20: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
9b30: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
9b40: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
9b50: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ==pPager->dbOrig
9b60: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9b70: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9b80: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9b90: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
9ba0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9bb0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9bc0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
9bd0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9be0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
9bf0: 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
9c00: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9c10: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9c20: 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20  R_CACHEMOD:.    
9c30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9c40: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
9c50: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9c60: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9c70: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9c80: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
9c90: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
9ca0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20  {.        /* It 
9cb0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
9cc0: 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
9cd0: 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e  =wal here that n
9ce0: 65 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20  either the.     
9cf0: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
9d00: 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66  le nor the WAL f
9d10: 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68  ile are open. Th
9d20: 69 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e  is happens durin
9d30: 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  g.        ** a r
9d40: 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
9d50: 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65  ion that switche
9d60: 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d  s from journal_m
9d70: 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20  ode=off.        
9d80: 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ** to journal_mo
9d90: 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20  de=wal..        
9da0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
9db0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
9dc0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
9dd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
9de0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
9df0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
9e00: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9e10: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9e20: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
9e30: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9e40: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9e50: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
9e60: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
9e70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9e80: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9e90: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
9ea0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9eb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9ec0: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9ed0: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
9ee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9ef0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
9f00: 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20  ER_DBMOD:.      
9f10: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9f20: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
9f30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9f40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9f50: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9f60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
9f70: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
9f80: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
9f90: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58  rt( p->eLock>=EX
9fa0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
9fb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
9fc0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
9fd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
9fe0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9ff0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a000: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a010: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a020: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a030: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a040: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a050: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a060: 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e<=pPager->dbHin
a070: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a080: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a090: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a0a0: 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73  ISHED:.      ass
a0b0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
a0c0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a0d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a0e0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a0f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a100: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
a110: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a120: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a130: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a140: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a150: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a160: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a170: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a180: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a190: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a1a0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a1b0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a1c0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a1d0: 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a  _ERROR:.      /*
a1e0: 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
a1f0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
a200: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
a210: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69  e to the pager i
a220: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52  f.      ** in ER
a230: 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
a240: 77 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73  wise the pager s
a250: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
a260: 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20  dy dropped.     
a270: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e   ** back to OPEN
a280: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
a290: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2a0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
a2b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a2c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a2d0: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
a2e0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a2f0: 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  )>0 );.      bre
a300: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
a310: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
a320: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
a330: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a340: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
a350: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a360: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
a370: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
a380: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
a390: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
a3a0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
a3b0: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
a3c0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
a3d0: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
a3e0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
a3f0: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
a400: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
a410: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
a420: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
a430: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
a440: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
a450: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
a460: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
a470: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a480: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
a490: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
a4a0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
a4b0: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
a4c0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
a4d0: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
a4e0: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
a4f0: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
a500: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
a510: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
a520: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
a530: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
a540: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
a550: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
a560: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
a570: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
a580: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
a590: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
a5a0: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
a5b0: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
a5c0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
a5d0: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
a5e0: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
a5f0: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
a600: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
a610: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
a620: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
a630: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
a640: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
a650: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
a660: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
a670: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
a680: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
a690: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
a6a0: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
a6b0: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
a6c0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a6d0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
a6e0: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
a6f0: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
a700: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a710: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a720: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
a730: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
a740: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
a750: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
a760: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
a770: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a780: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
a790: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
a7a0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
a7b0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a7c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
a7d0: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
a7e0: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
a7f0: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
a800: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
a810: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
a820: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
a830: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
a840: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
a850: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
a860: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
a870: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
a880: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
a890: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
a8a0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
a8b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
a8c0: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
a8d0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
a8e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
a8f0: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
a900: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
a910: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
a920: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
a930: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
a940: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a950: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a960: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
a970: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
a980: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a990: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a9a0: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
a9b0: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
a9c0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a9d0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
a9e0: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
a9f0: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
aa00: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
aa10: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
aa20: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
aa30: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
aa40: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
aa50: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
aa60: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
aa70: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
aa80: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aa90: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aaa0: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
aab0: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
aac0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
aad0: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
aae0: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
aaf0: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
ab00: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
ab10: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
ab20: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
ab30: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
ab40: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
ab50: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
ab60: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
ab70: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
ab80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
ab90: 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  if it is necessa
aba0: 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65  ry to write page
abb0: 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73   *pPg into the s
abc0: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41  ub-journal..** A
abd0: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
abe0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
abf0: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
ac00: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
ac10: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70  ne.** or more op
ac20: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f  en savepoints fo
ac30: 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20  r which:.**.**  
ac40: 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62   * The page-numb
ac50: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
ac60: 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65  or equal to Page
ac70: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
ac80: 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
ac90: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
aca0: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e  ng to the page-n
acb0: 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74  umber is not set
acc0: 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72   in.**     Pager
acd0: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
ace0: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
acf0: 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72  c int subjRequir
ad00: 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  esPage(PgHdr *pP
ad10: 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  g){.  Pgno pgno 
ad20: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50  = pPg->pgno;.  P
ad30: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
ad40: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
ad50: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
ad60: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
ad70: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
ad80: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
ad90: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
ada0: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
adb0: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
adc0: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
add0: 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49  BitvecTest(p->pI
ade0: 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f  nSavepoint, pgno
adf0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
ae00: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
ae10: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ae20: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
ae30: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
ae40: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
ae50: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73  urnal file..*/.s
ae60: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
ae70: 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70  Journal(PgHdr *p
ae80: 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  Pg){.  return sq
ae90: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
aea0: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e  pPg->pPager->pIn
aeb0: 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
aec0: 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  no);.}../*.** Re
aed0: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
aee0: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76  ger from the giv
aef0: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
af00: 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69  or.  Store the i
af10: 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69  nteger.** that i
af20: 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e  s read in *pRes.
af30: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
af40: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
af50: 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a   worked, or an.*
af60: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
af70: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
af80: 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rong..**.** All 
af90: 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65  values are store
afa0: 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67  d on disk as big
afb0: 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74  -endian..*/.stat
afc0: 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74  ic int read32bit
afd0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
afe0: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
aff0: 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e  u32 *pRes){.  un
b000: 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34  signed char ac[4
b010: 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ];.  int rc = sq
b020: 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
b030: 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20  ac, sizeof(ac), 
b040: 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  offset);.  if( r
b050: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b060: 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69      *pRes = sqli
b070: 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b  te3Get4byte(ac);
b080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
b0a0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
b0b0: 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20  r into a string 
b0c0: 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e  buffer in big-en
b0d0: 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e  dian byte order.
b0e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33  .*/.#define put3
b0f0: 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69  2bits(A,B)  sqli
b100: 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a  te3Put4byte((u8*
b110: 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  )A,B).../*.** Wr
b120: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b130: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
b140: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b150: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tor.  Return SQL
b160: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
b170: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
b180: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
b190: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
b1a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
b1b0: 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  te32bits(sqlite3
b1c0: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
b1d0: 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b  ffset, u32 val){
b1e0: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
b1f0: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
b200: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
b210: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
b220: 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b   ac, 4, offset);
b230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
b240: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b250: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63  le to level eLoc
b260: 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  k, which must be
b270: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a   either NO_LOCK.
b280: 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  ** or SHARED_LOC
b290: 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  K. Regardless of
b2a0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
b2b0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c  the call to xUnl
b2c0: 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64  ock().** succeed
b2d0: 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  s, set the Pager
b2e0: 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20  .eLock variable 
b2f0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74  to match the (at
b300: 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63  tempted) new loc
b310: 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  k..**.** Except,
b320: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
b330: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
b340: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73  N_LOCK when this
b350: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
b360: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
b370: 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68  odify it. See th
b380: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
b390: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a  the #define of .
b3a0: 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
b3b0: 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
b3c0: 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  on of this..*/.s
b3d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
b3e0: 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70  nlockDb(Pager *p
b3f0: 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b  Pager, int eLock
b400: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
b410: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
b420: 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  rt( !pPager->exc
b430: 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
b440: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f  ager->eLock==eLo
b450: 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ck );.  assert( 
b460: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock==NO_LOCK |
b470: 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  | eLock==SHARED_
b480: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
b490: 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ( eLock!=NO_LOCK
b4a0: 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
b4b0: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
b4c0: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
b4d0: 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
b4e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
b4f0: 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock>=eLock );.  
b500: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b510: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
b520: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
b530: 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
b540: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
b550: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
b560: 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63  eLock = (u8)eLoc
b570: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  k;.    }.    IOT
b580: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
b590: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
b5a0: 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65  eLock)).  }.  re
b5b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b5c0: 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  * Lock the datab
b5d0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
b5e0: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
b5f0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48  ust be either SH
b600: 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45  ARED_LOCK,.** RE
b610: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
b620: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49  XCLUSIVE_LOCK. I
b630: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
b640: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
b650: 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  the.** Pager.eLo
b660: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
b670: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
b680: 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63  tate. .**.** Exc
b690: 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c  ept, if Pager.eL
b6a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
b6b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20  KNOWN_LOCK when 
b6c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
b6d0: 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20   .** called, do 
b6e0: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e  not modify it un
b6f0: 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63  less the new loc
b700: 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58  king state is EX
b710: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a  CLUSIVE_LOCK. .*
b720: 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  * See the commen
b730: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
b740: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
b750: 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
b760: 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68  nation .** of th
b770: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
b780: 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61  t pagerLockDb(Pa
b790: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
b7a0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
b7b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
b7c0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
b7d0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
b7e0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
b7f0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45  LOCK || eLock==E
b800: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
b810: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
b820: 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50  Lock<eLock || pP
b830: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
b840: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
b850: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
b860: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
b870: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
b880: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
b890: 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21   (pPager->eLock!
b8a0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65  =UNKNOWN_LOCK||e
b8b0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
b8c0: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70  LOCK) ){.      p
b8d0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
b8e0: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  u8)eLock;.      
b8f0: 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
b900: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
b910: 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20   eLock)).    }. 
b920: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b930: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b940: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
b950: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
b960: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
b970: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
b980: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
b990: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
b9a0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
b9b0: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
b9c0: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
b9d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
b9e0: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
b9f0: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
ba00: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
ba10: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
ba20: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
ba30: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
ba40: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
ba50: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
ba60: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
ba70: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
ba80: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
ba90: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
baa0: 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  .** The optimiza
bab0: 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77  tion is also alw
bac0: 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ays enabled for 
bad0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
bae0: 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72   It is.** an err
baf0: 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  or to call this 
bb00: 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67  function if pPag
bb10: 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  er is opened on 
bb20: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
bb30: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
bb40: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
bb50: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
bb60: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
bb70: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
bb80: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
bb90: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
bba0: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
bbb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bbc0: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
bbd0: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
bbe0: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
bbf0: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
bc00: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
bc10: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
bc20: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
bc30: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
bc40: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
bc50: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
bc60: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
bc70: 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ile ){.    int d
bc80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bca0: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
bcb0: 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e  istics */.    in
bcc0: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
bcf0: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  /.    int szPage
bd00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bd10: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
bd20: 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  size */..    ass
bd30: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
bd40: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64  er->fd) );.    d
bd50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
bd60: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
bd70: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
bd80: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50      nSector = pP
bd90: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
bda0: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
bdb0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
bdc0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ..    assert(SQL
bdd0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
bde0: 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
bdf0: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
be00: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
be10: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
be20: 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28      if( 0==(dc&(
be30: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
be40: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
be50: 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61   || nSector>szPa
be60: 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ge) ){.      ret
be70: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
be80: 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e  ..  return JOURN
be90: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
bea0: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
beb0: 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e  Z(pPager);.}.#en
bec0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  dif../*.** If SQ
bed0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
bee0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
bef0: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
bf00: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
bf10: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
bf20: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
bf30: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
bf40: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
bf50: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
bf60: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
bf70: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
bf80: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
bf90: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
bfa0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
bfb0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
bfc0: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
bfd0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
bfe0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
bff0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
c000: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
c010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
c020: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
c030: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
c040: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
c050: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
c060: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
c070: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
c080: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
c090: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
c0a0: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
c0b0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
c0c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
c0d0: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
c0e0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
c0f0: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
c100: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
c110: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
c120: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
c130: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
c140: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
c150: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
c160: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
c170: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
c180: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
c190: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
c1a0: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
c1b0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
c1c0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
c1d0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
c1e0: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
c1f0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
c200: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
c210: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
c220: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
c230: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
c240: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
c250: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
c260: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
c270: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
c280: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
c290: 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
c2a0: 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
c2b0: 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
c2c0: 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
c2d0: 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73   || pPg->pageHas
c2e0: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
c2f0: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
c300: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
c310: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
c320: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
c330: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
c340: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74  define pager_set
c350: 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65  _pagehash(X).#de
c360: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
c370: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
c380: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c390: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
c3a0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
c3b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c3c0: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
c3d0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
c3e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c3f0: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64  attempts to read
c400: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c410: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  l file name from
c420: 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20   the .** end of 
c430: 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66  the file and, if
c440: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70   successful, cop
c450: 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  ies it into memo
c460: 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ry supplied .** 
c470: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
c480: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
c490: 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  e writeMasterJou
c4a0: 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66  rnal() for the f
c4b0: 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f  ormat.** used to
c4c0: 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20   store a master 
c4d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c4e0: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
c4f0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
c500: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
c510: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
c520: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
c530: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
c540: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
c550: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
c560: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
c570: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
c580: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
c590: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
c5a0: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
c5b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c5c0: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
c5d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
c5e0: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
c5f0: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
c600: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
c610: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
c620: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
c630: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
c640: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
c650: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
c660: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
c670: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
c680: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
c690: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c6a0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
c6b0: 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  esent at the end
c6c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
c6d0: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  ** file, then it
c6e0: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
c6f0: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
c700: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
c710: 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  . A.** nul-termi
c720: 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70  nator byte is ap
c730: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
c740: 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ffer following t
c750: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
c760: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
c770: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64  **.** If it is d
c780: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
c790: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
c7a0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
c7b0: 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65  esent .** zMaste
c7c0: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
c7d0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
c7e0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
c7f0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
c800: 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  s while reading 
c810: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
c820: 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65   file, an SQLite
c830: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
c840: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
c850: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
c860: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
c870: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
c880: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
c890: 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  u32 nMaster){.  
c8a0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
c8b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
c8c0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
c8d0: 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
c8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
c8f0: 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20  gth in bytes of 
c900: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
c910: 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a  ame */.  i64 szJ
c920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c930: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
c940: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f  e in bytes of jo
c950: 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c  urnal file pJrnl
c960: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20   /* MJ checksum 
c990: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
c9a0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
c9b0: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
c9c0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
c9d0: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
c9e0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
c9f0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
ca00: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
ca10: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
ca20: 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74  eader */.  zMast
ca30: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
ca40: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
ca50: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
ca60: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
ca70: 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c  szJ)).   || szJ<
ca80: 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  16.   || SQLITE_
ca90: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
caa0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
cab0: 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c  16, &len)).   ||
cac0: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20   len>=nMaster . 
cad0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
cae0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
caf0: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
cb00: 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53  &cksum)).   || S
cb10: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
cb20: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
cb30: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
cb40: 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65  szJ-8)).   || me
cb50: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
cb60: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20  urnalMagic, 8). 
cb70: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
cb80: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
cb90: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
cba0: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
cbb0: 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  len)).  ){.    r
cbc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
cbd0: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
cbe0: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
cbf0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cc00: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
cc10: 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b  (u=0; u<len; u++
cc20: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
cc30: 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a  zMaster[u];.  }.
cc40: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
cc50: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
cc60: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
cc70: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
cc80: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
cc90: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
cca0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
ccb0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ccc0: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
ccd0: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
cce0: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
ccf0: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
cd00: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
cd10: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
cd20: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
cd30: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
cd40: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
cd50: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  /.    len = 0;. 
cd60: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e   }.  zMaster[len
cd70: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20  ] = '\0';.   .  
cd80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cd90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
cda0: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  n the offset of 
cdb0: 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  the sector bound
cdc0: 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69  ary at or immedi
cdd0: 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  ately .** follow
cde0: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ing the value in
cdf0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ce00: 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20  Off, assuming a 
ce10: 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20  sector .** size 
ce20: 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  of pPager->secto
ce30: 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  rSize bytes..**.
ce40: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
ce50: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
ce60: 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a  .**.**   Pager.j
ce70: 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20  ournalOff       
ce80: 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a     Return value.
ce90: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
cec0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
cee0: 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20     512          
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
cf00: 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20  .**   100       
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20  512.**   2000   
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
cf50: 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61  tatic i64 journa
cf60: 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72  lHdrOffset(Pager
cf70: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
cf80: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
cf90: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
cfa0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
cfb0: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
cfc0: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
cfd0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
cfe0: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
cff0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
d000: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
d010: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
d020: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
d030: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
d040: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
d050: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
d060: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d070: 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
d080: 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   offset;.}../*.*
d090: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
d0a0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
d0b0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
d0c0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
d0d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d0e0: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
d0f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d100: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72   has not been wr
d110: 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68  itten to.** with
d120: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
d130: 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e  ransaction (i.e.
d140: 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   if Pager.journa
d150: 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  lOff==0)..**.** 
d160: 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73  If doTruncate is
d170: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65   non-zero or the
d180: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
d190: 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65  zeLimit variable
d1a0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c   is.** set to 0,
d1b0: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
d1c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d1d0: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
d1e0: 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65   size. Otherwise
d1f0: 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38  ,.** zero the 28
d200: 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20  -byte header at 
d210: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
d220: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
d230: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a  n either case, .
d240: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
d250: 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  is not in no-syn
d260: 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  c mode, sync the
d270: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
d280: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66  mediately .** af
d290: 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74  ter writing or t
d2a0: 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a  runcating it..**
d2b0: 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75  .** If Pager.jou
d2c0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73  rnalSizeLimit is
d2d0: 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69   set to a positi
d2e0: 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ve, non-zero val
d2f0: 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f  ue, and.** follo
d300: 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74  wing the truncat
d310: 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64  ion or zeroing d
d320: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74  escribed above t
d330: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
d340: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
d350: 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67  in bytes is larg
d360: 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
d370: 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74  ue, then truncat
d380: 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
d390: 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a   file to Pager.j
d3a0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d3b0: 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e  bytes. The journ
d3c0: 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
d3d0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73  not need to be s
d3e0: 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
d3f0: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
d400: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
d410: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61  rror occurs, aba
d420: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
d430: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49  and return the I
d440: 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  O error code..**
d450: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
d460: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
d470: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
d480: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
d490: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
d4a0: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
d4b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d4e0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
d4f0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
d500: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
d510: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
d520: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
d530: 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d    const i64 iLim
d540: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  it = pPager->jou
d550: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
d560: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
d570: 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20   of jsl */..    
d580: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
d590: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
d5a0: 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75  )).    if( doTru
d5b0: 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d  ncate || iLimit=
d5c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
d5d0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
d5e0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
d5f0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
d600: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
d610: 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32  t char zeroHdr[2
d620: 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20  8] = {0};.      
d630: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
d640: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
d650: 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66   zeroHdr, sizeof
d660: 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20  (zeroHdr), 0);. 
d670: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
d680: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
d690: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
d6a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d6b0: 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
d6c0: 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
d6d0: 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67  NC_DATAONLY|pPag
d6e0: 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
d6f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
d700: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
d710: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
d720: 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65  ommitted but the
d730: 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20   write lock .   
d740: 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c   ** is still hel
d750: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  d on the file. I
d760: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a  f there is a siz
d770: 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72  e limit configur
d780: 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74  ed for .    ** t
d790: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  he persistent jo
d7a0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f  urnal and the jo
d7b0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
d7c0: 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f  ntly consumes mo
d7d0: 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  re.    ** space 
d7e0: 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20  than that limit 
d7f0: 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e  allows for, trun
d800: 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
d810: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
d820: 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65    ** to sync the
d830: 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   file following 
d840: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
d850: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
d860: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d870: 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  iLimit>0 ){.    
d880: 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20    i64 sz;.      
d890: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
d8a0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
d8b0: 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  fd, &sz);.      
d8c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d8d0: 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29  K && sz>iLimit )
d8e0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
d8f0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
d900: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c  (pPager->jfd, iL
d910: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
d920: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d930: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
d940: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d950: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
d960: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
d970: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
d980: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
d990: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
d9a0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
d9b0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
d9c0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
d9d0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
d9e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
d9f0: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
da00: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
da10: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
da20: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
da30: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
da40: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
da50: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
da60: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
da70: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
da80: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
da90: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
daa0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
dab0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
dac0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
dad0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
dae0: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
daf0: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
db00: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
db10: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
db20: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
db30: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44  .** - 4 bytes: D
db40: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
db50: 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  e..** .** Follow
db60: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
db70: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
db80: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
db90: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
dba0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
dbb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
dbc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
dbd0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
dbe0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
dbf0: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
dc00: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
dc10: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f  r->pTmpSpace;  /
dc20: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63  * Temporary spac
dc30: 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  e used to build 
dc40: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
dc50: 6e 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70  nHeader = (u32)p
dc60: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
dc70: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
dc80: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
dc90: 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32  zHeader */.  u32
dca0: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61   /* Bytes of hea
dcd0: 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74  der sector writt
dce0: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  en */.  int ii; 
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
dd10: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
dd20: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
dd30: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
dd40: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
dd50: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
dd60: 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48  en. */..  if( nH
dd70: 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44  eader>JOURNAL_HD
dd80: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
dd90: 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f      nHeader = JO
dda0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ddb0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
ddc0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
ddd0: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
dde0: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77  nd any of them w
ddf0: 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a  ere created .  *
de00: 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74  * since the most
de10: 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20   recent journal 
de20: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
de30: 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a  en, update the .
de40: 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
de50: 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66  int.iHdrOffset f
de60: 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ields now..  */.
de70: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
de80: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
de90: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t; ii++){.    if
dea0: 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  ( pPager->aSavep
deb0: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
dec0: 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
ded0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
dee0: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
def0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
df00: 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
df10: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
df20: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
df30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
df40: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
df50: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a  pPager);..  /* .
df60: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
df70: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
df80: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
df90: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
dfa0: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
dfb0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
dfc0: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
dfd0: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
dfe0: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
dff0: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
e000: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
e010: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
e020: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
e030: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
e040: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
e050: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
e060: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
e070: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
e080: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
e090: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
e0a0: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
e0b0: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
e0c0: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
e0d0: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
e0e0: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
e0f0: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
e100: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
e110: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
e120: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
e130: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
e140: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
e150: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
e160: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
e170: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
e180: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
e190: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
e1a0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
e1b0: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
e1c0: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
e1d0: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
e1e0: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
e1f0: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
e200: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
e210: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
e220: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
e230: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
e240: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e250: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
e260: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
e270: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
e280: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
e290: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
e2a0: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
e2b0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
e2c0: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
e2d0: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
e2e0: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
e2f0: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
e300: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
e310: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
e320: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
e330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
e340: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
e350: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
e360: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
e370: 6e 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nc );.  if( pPag
e380: 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70  er->noSync || (p
e390: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
e3a0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
e3b0: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20  LMODE_MEMORY).  
e3c0: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
e3d0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
e3e0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
e3f0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e400: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
e410: 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64      memcpy(zHead
e420: 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
e430: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
e440: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70  alMagic));.    p
e450: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e460: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e470: 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66  lMagic)], 0xffff
e480: 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffff);.  }else{.
e490: 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64      memset(zHead
e4a0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a  er, 0, sizeof(aJ
e4b0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b  ournalMagic)+4);
e4c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
e4d0: 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68  andom check-hash
e4e0: 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20   initialiser */ 
e4f0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
e500: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61  mness(sizeof(pPa
e510: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c  ger->cksumInit),
e520: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
e530: 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74  nit);.  put32bit
e540: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e550: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e560: 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  +4], pPager->cks
e570: 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68  umInit);.  /* Th
e580: 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61  e initial databa
e590: 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  se size */.  put
e5a0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e5b0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e5c0: 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72  agic)+8], pPager
e5d0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20  ->dbOrigSize);. 
e5e0: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
e5f0: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
e600: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
e610: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e620: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e630: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20  rnalMagic)+12], 
e640: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
e650: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70  ze);..  /* The p
e660: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  age size */.  pu
e670: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e680: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e690: 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67  Magic)+16], pPag
e6a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
e6b0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e    /* Initializin
e6c0: 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  g the tail of th
e6d0: 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  e buffer is not 
e6e0: 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72  necessary.  Ever
e6f0: 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b  ything.  ** work
e700: 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f  s find if the fo
e710: 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29  llowing memset()
e720: 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75   is omitted.  Bu
e730: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20  t initializing. 
e740: 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70   ** the memory p
e750: 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64  revents valgrind
e760: 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e   from complainin
e770: 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c  g, so we are wil
e780: 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b  ling to.  ** tak
e790: 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  e the performanc
e7a0: 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65  e hit..  */.  me
e7b0: 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69  mset(&zHeader[si
e7c0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e7d0: 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20  ic)+20], 0,.    
e7e0: 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69       nHeader-(si
e7f0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e800: 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20  ic)+20));..  /* 
e810: 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73  In theory, it is
e820: 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20   only necessary 
e830: 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20  to write the 28 
e840: 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a  bytes that the .
e850: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
e860: 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20  der consumes to 
e870: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e880: 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72   here. Then incr
e890: 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20  ement the .  ** 
e8a0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
e8b0: 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55   variable by JOU
e8c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74  RNAL_HDR_SZ so t
e8d0: 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20  hat the next .  
e8e0: 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69  ** record is wri
e8f0: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c  tten to the foll
e900: 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65  owing sector (le
e910: 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74  aving a gap in t
e920: 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61  he file.  ** tha
e930: 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63  t will be implic
e940: 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62  itly filled in b
e950: 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a  y the OS)..  **.
e960: 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20    ** However it 
e970: 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65  has been discove
e980: 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65  red that on some
e990: 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61   systems this pa
e9a0: 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20  ttern can .  ** 
e9b0: 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  be significantly
e9c0: 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e   slower than con
e9d0: 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e  tiguously writin
e9e0: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  g data to the fi
e9f0: 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  le,.  ** even if
ea00: 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c   that means expl
ea10: 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64  icitly writing d
ea20: 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b  ata to the block
ea30: 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e   of .  ** (JOURN
ea40: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
ea50: 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bytes that will 
ea60: 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20  not be used. So 
ea70: 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a  that is what.  *
ea80: 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a  * is done. .  **
ea90: 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69  .  ** The loop i
eaa0: 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20  s required here 
eab0: 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74  in case the sect
eac0: 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65  or-size is large
ead0: 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a  r than the .  **
eae0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73   database page s
eaf0: 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a  ize. Since the z
eb00: 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73  Header buffer is
eb10: 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65   only Pager.page
eb20: 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20  Size.  ** bytes 
eb30: 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68  in size, more th
eb40: 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73  an one call to s
eb50: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20  qlite3OsWrite() 
eb60: 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a  may be required.
eb70: 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65    ** to populate
eb80: 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
eb90: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
eba0: 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e  r..  */ .  for(n
ebb0: 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c  Write=0; rc==SQL
ebc0: 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a  ITE_OK&&nWrite<J
ebd0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ebe0: 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e  ager); nWrite+=n
ebf0: 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54  Header){.    IOT
ec00: 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
ec10: 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
ec20: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
ec30: 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29  alHdr, nHeader))
ec40: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ec50: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
ec60: 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e  >jfd, zHeader, n
ec70: 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e  Header, pPager->
ec80: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20  journalOff);.   
ec90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
eca0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
ecb0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ecc0: 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  f );.    pPager-
ecd0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e  >journalOff += n
ece0: 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  Header;.  }..  r
ecf0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ed00: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
ed10: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
ed20: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
ed30: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
ed40: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
ed50: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
ed60: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
ed70: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
ed80: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
ed90: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
eda0: 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  The current loca
edb0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
edc0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65  nal file is give
edd0: 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  n by.** pPager->
ede0: 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20  journalOff. See 
edf0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
ee00: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
ee10: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a  rnalHdr() for.**
ee20: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
ee30: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
ee40: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
ee50: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
ee60: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
ee70: 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73  fully, *pNRec is
ee80: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
ee90: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
eea0: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
eeb0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
eec0: 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20  *pDbSize is set 
eed0: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
eee0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
eef0: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
ef00: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
ef10: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
ef20: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
ef30: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
ef40: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
ef50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
ef60: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
ef70: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
ef80: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
ef90: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
efa0: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
efb0: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
efc0: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
efd0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
efe0: 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a  and *pNRec and *
eff0: 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65  PDbSize are unde
f000: 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e  fined.  If JOURN
f010: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
f020: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
f030: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
f040: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
f050: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
f060: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f070: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
f080: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
f090: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f0a0: 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
f0b0: 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a  */.  int isHot,.
f0c0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
f0d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
f0e0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70  * Size of the op
f0f0: 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
f100: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
f110: 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20  2 *pNRec,       
f120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
f130: 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72  T: Value read fr
f140: 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  om the nRec fiel
f150: 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53  d */.  u32 *pDbS
f160: 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
f170: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f180: 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61  e of original da
f190: 74 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c  tabase size fiel
f1a0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
f1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f1c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
f1d0: 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67   code */.  unsig
f1e0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
f1f0: 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66  8];     /* A buf
f200: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
f210: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
f220: 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f240: 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72  * Offset of jour
f250: 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67  nal header being
f260: 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65   read */..  asse
f270: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
f280: 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20  r->jfd) );      
f290: 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  /* Journal file 
f2a0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f  must be open. */
f2b0: 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50  ..  /* Advance P
f2c0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
f2d0: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
f2e0: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e  the next sector.
f2f0: 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75   If the.  ** jou
f300: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f  rnal file is too
f310: 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65   small for there
f320: 20 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20   to be a header 
f330: 73 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20  stored at this. 
f340: 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72   ** point, retur
f350: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
f360: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   */.  pPager->jo
f370: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
f380: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
f390: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
f3a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f  r->journalOff+JO
f3b0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
f3c0: 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69  ger) > journalSi
f3d0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
f3e0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
f3f0: 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
f400: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f410: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  ;..  /* Read in 
f420: 74 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65  the first 8 byte
f430: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
f440: 20 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79   header. If they
f450: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20   do not match.  
f460: 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74  ** the  magic st
f470: 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68  ring found at th
f480: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
f490: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
f4a0: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
f4b0: 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49  TE_DONE. If an I
f4c0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
f4d0: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
f4e0: 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
f4f0: 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20  .  ** proceed.. 
f500: 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20   */.  if( isHot 
f510: 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67  || iHdrOff!=pPag
f520: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29  er->journalHdr )
f530: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
f540: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
f550: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
f560: 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48  zeof(aMagic), iH
f570: 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20  drOff);.    if( 
f580: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
f590: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
f5a0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
f5b0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
f5c0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
f5d0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ))!=0 ){.      r
f5e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
f5f0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
f600: 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  /* Read the firs
f610: 74 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66  t three 32-bit f
f620: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75  ields of the jou
f630: 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65  rnal header: The
f640: 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64   nRec.  ** field
f650: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69  , the checksum-i
f660: 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74  nitializer and t
f670: 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
f680: 20 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20   at the start.  
f690: 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  ** of the transa
f6a0: 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e  ction. Return an
f6b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
f6c0: 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
f6d0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53  ng..  */.  if( S
f6e0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
f6f0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
f700: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
f710: 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c  8, pNRec)).   ||
f720: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f730: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f740: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f750: 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63  f+12, &pPager->c
f760: 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c  ksumInit)).   ||
f770: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f780: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f790: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f7a0: 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a  f+16, pDbSize)).
f7b0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
f7c0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rc;.  }..  if( p
f7d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f7e0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  f==0 ){.    u32 
f7f0: 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20  iPageSize;      
f800: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f810: 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
f820: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
f830: 0a 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72  .    u32 iSector
f840: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
f850: 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65    /* Sector-size
f860: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
f870: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20  l header */..   
f880: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
f890: 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
f8a0: 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68  r-size journal h
f8b0: 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f  eader fields. */
f8c0: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
f8d0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f8e0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f8f0: 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69  , iHdrOff+20, &i
f900: 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20  SectorSize)).   
f910: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
f920: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
f930: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
f940: 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65  drOff+24, &iPage
f950: 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20  Size)).    ){.  
f960: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f970: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72     }..    /* Ver
f980: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
f990: 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73  prior to 3.5.8 s
f9a0: 65 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  et the page-size
f9b0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20   field of the.  
f9c0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
f9d0: 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  der to zero. In 
f9e0: 74 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d  this case, assum
f9f0: 65 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72  e that the Pager
fa00: 2e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a  .pageSize.    **
fa10: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72   variable is alr
fa20: 65 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20  eady set to the 
fa30: 63 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a  correct page siz
fa40: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
fa50: 28 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29  ( iPageSize==0 )
fa60: 7b 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a  {.      iPageSiz
fa70: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
fa80: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Size;.    }..   
fa90: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
faa0: 68 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66  he values read f
fab0: 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a  rom the page-siz
fac0: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
fad0: 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20  e fields.    ** 
fae0: 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
faf0: 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67  . To be 'in rang
fb00: 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20  e', both values 
fb10: 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  need to be a pow
fb20: 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f  er.    ** of two
fb30: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
fb40: 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72   equal to 512 or
fb50: 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65   32, and not gre
fb60: 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20  ater than their 
fb70: 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69  .    ** respecti
fb80: 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  ve compile time 
fb90: 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a  maximum limits..
fba0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
fbb0: 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20  PageSize<512    
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
fbd0: 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a   iSectorSize<32.
fbe0: 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a       || iPageSiz
fbf0: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
fc00: 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f  E_SIZE || iSecto
fc10: 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52  rSize>MAX_SECTOR
fc20: 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28  _SIZE.     || ((
fc30: 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61  iPageSize-1)&iPa
fc40: 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20  geSize)!=0   || 
fc50: 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29  ((iSectorSize-1)
fc60: 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30  &iSectorSize)!=0
fc70: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
fc80: 2a 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20  * If the either 
fc90: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72  the page-size or
fca0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20   sector-size in 
fcb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
fcc0: 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  er is .      ** 
fcd0: 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68  invalid, then th
fce0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
fcf0: 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rote the journal
fd00: 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76  -header must hav
fd10: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73  e .      ** cras
fd20: 68 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68  hed before the h
fd30: 65 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64  eader was synced
fd40: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73  . In this case s
fd50: 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20  top reading .   
fd60: 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
fd70: 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  l file here..   
fd80: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
fd90: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
fda0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70      }..    /* Up
fdb0: 64 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69  date the page-si
fdc0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
fdd0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
fde0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  the journal. .  
fdf0: 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63    ** Use a testc
fe00: 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d  ase() macro to m
fe10: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61  ake sure that ma
fe20: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74  lloc failure wit
fe30: 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  hin .    ** Page
fe40: 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69  rSetPagesize() i
fe50: 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f  s tested..    */
fe60: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fe70: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
fe80: 65 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65  e(pPager, &iPage
fe90: 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Size, -1);.    t
fea0: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
feb0: 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
fec0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
fed0: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
fee0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
fef0: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20  lue used by .   
ff00: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
ff10: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
ff20: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
ff30: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
ff40: 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79     ** created by
ff50: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
ff60: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
ff70: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
ff80: 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e  e.    ** is bein
ff90: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
ffa0: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
ffb0: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
ffc0: 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
ffd0: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
ffe0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
fff0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
10000 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f   routine..    */
10010 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
10020 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f  torSize = iSecto
10030 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50  rSize;.  }..  pP
10040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10050 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
10060 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
10070 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
10080 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
10090 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
100a0 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
100b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
100c0 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
100d0 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
100e0 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
100f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10100 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
10110 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
10120 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
10130 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
10140 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
10150 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
10160 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
10170 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
10180 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
10190 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
101a0 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
101b0 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
101c0 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
101d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79  :.**.**   + 4 by
101e0 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
101f0 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74  NO..**   + N byt
10200 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
10210 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75  al filename in u
10220 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62  tf-8..**   + 4 b
10230 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20  ytes: N (length 
10240 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
10250 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c  l name in bytes,
10260 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   no nul-terminat
10270 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  or)..**   + 4 by
10280 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
10290 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
102a0 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65  m..**   + 8 byte
102b0 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
102c0 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
102d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
102e0 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
102f0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
10300 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
10310 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
10320 2c 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74  , where each byt
10330 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
10340 20 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62   as a signed 8-b
10350 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  it integer..**.*
10360 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
10370 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
10380 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
10390 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
103a0 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
103b0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
103c0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
103d0 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
103e0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
103f0 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
10400 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
10410 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10430 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
10440 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20    int nMaster;  
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10460 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
10470 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
10480 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
104b0 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72  f header in jour
104c0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
104d0 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20  4 jrnlSize;     
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
104f0 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
10500 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a  l file on disk *
10510 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  /.  u32 cksum = 
10520 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10530 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
10540 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
10550 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
10560 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
10570 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er==0 );.  asser
10580 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
10590 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
105a0 28 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c  ( !zMaster .   |
105b0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
105c0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
105d0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
105e0 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
105f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
10600 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
10610 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  F .  ){.    retu
10620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10630 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  }.  pPager->setM
10640 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73  aster = 1;.  ass
10650 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
10660 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73  er->jfd) );.  as
10670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
10680 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
10690 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
106a0 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
106b0 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
106c0 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
106d0 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
106e0 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
106f0 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
10700 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
10710 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
10720 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10730 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
10740 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
10750 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
10760 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
10770 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
10780 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
10790 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
107a0 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
107b0 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
107c0 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
107d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
107e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
107f0 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
10800 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
10810 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
10820 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
10830 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
10840 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
10850 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
10860 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
10870 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
10880 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
10890 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
108a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
108b0 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
108c0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
108d0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
108e0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
108f0 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
10900 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
10910 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10920 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
10930 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
10940 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10950 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10960 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
10970 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
10980 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
10990 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
109a0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
109b0 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
109c0 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
109d0 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
109e0 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
109f0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10a00 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
10a10 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
10a20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10a30 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
10a40 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
10a50 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20  ournalMagic, 8, 
10a60 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
10a70 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  r+8))).  ){.    
10a80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10a90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10aa0 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b  Off += (nMaster+
10ab0 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  20);..  /* If th
10ac0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65  e pager is in pe
10ad0 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20  ristent-journal 
10ae0 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70  mode, then the p
10af0 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f  hysical .  ** jo
10b00 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65  urnal-file may e
10b10 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65  xtend past the e
10b20 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  nd of the master
10b30 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20  -journal name.  
10b40 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f  ** and 8 bytes o
10b50 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73  f magic data jus
10b60 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
10b70 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a   file. This is .
10b80 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62    ** dangerous b
10b90 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20  ecause the code 
10ba0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f  to rollback a ho
10bb0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  t-journal file. 
10bc0 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   ** will not be 
10bd0 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65  able to find the
10be0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10bf0 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
10c00 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  e .  ** whether 
10c10 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
10c20 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a  al is hot. .  **
10c30 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68  .  ** Easiest th
10c40 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69  ing to do in thi
10c50 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f  s scenario is to
10c60 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
10c70 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
10c80 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64   to the required
10c90 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69   size..  */ .  i
10ca0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  f( SQLITE_OK==(r
10cb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
10cc0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
10cd0 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20  d, &jrnlSize)). 
10ce0 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50    && jrnlSize>pP
10cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10d00 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  .  ){.    rc = s
10d10 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
10d20 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
10d30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10d40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10d50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  rc;.}../*.** Fin
10d60 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
10d70 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
10d80 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
10d90 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  . Return.** a po
10da0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
10db0 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  e or NULL if the
10dc0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
10dd0 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61  is not .** alrea
10de0 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  dy in memory..*/
10df0 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
10e00 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
10e10 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
10e20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
10e30 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
10e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10e50 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
10e60 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
10e70 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c  ssible for a cal
10e80 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68  l to PcacheFetch
10e90 28 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c  () with createFl
10ea0 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61  ag==0 to.  ** fa
10eb0 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74  il, since no att
10ec0 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
10ed0 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
10ee0 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20  will be made..  
10ef0 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  */.  (void)sqlit
10f00 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
10f10 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
10f20 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72  gno, 0, &p);.  r
10f30 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
10f40 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e  * Discard the en
10f50 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
10f60 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
10f70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74  age-cache..*/.st
10f80 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
10f90 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
10fa0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  ger){.  sqlite3B
10fb0 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
10fc0 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
10fd0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
10fe0 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
10ff0 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  che);.}../*.** F
11000 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
11010 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
11020 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
11030 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
11040 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
11050 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
11060 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
11070 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
11080 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
11090 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
110a0 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
110b0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
110c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
110d0 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
110e0 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
110f0 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11110 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
11120 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
11130 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
11140 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11150 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11160 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
11170 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11180 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
11190 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
111a0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
111b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
111c0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71  lusiveMode || sq
111d0 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
111e0 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  l(pPager->sjfd) 
111f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
11200 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a  Close(pPager->sj
11210 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
11220 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
11230 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70  aSavepoint);.  p
11240 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11250 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
11260 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
11270 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  .  pPager->nSubR
11280 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ec = 0;.}../*.**
11290 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d   Set the bit num
112a0 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ber pgno in the 
112b0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
112c0 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  InSavepoint .** 
112d0 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f  bitvecs of all o
112e0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
112f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
11300 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a   if successful.*
11310 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
11320 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
11330 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f  ilure occurs..*/
11340 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54  .static int addT
11350 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
11360 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  s(Pager *pPager,
11370 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
11380 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11390 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
113a0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
113b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
113c0 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
113d0 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72  t code */..  for
113e0 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
113f0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
11400 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
11410 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
11420 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11430 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67  [ii];.    if( pg
11440 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a  no<=p->nOrig ){.
11450 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69        rc |= sqli
11460 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e  te3BitvecSet(p->
11470 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
11480 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  no);.      testc
11490 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
114a0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  NOMEM );.      a
114b0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
114c0 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
114d0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
114e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
114f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
11500 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11510 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
11520 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11530 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a  e mode and not.*
11540 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  * in the ERROR s
11550 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
11560 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65   it switches the
11570 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f   pager to PAGER_
11580 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a  OPEN.** state..*
11590 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
115a0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
115b0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
115c0 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
115d0 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c  file is.** compl
115e0 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  etely unlocked. 
115f0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
11600 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  nlocked and the 
11610 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73  file-system does
11620 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20  .** not exhibit 
11630 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f  the UNDELETABLE_
11640 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72  WHEN_OPEN proper
11650 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ty, the journal 
11660 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  file is.** close
11670 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e  d (if it is open
11680 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
11690 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f  pager is in ERRO
116a0 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  R state when thi
116b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
116c0 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f  lled, the .** co
116d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
116e0 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69  ger cache are di
116f0 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73  scarded before s
11700 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f  witching back to
11710 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74   .** the OPEN st
11720 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ate. Regardless 
11730 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70  of whether the p
11740 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
11750 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20  sive-mode.** or 
11760 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  not, any journal
11770 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68   file left in th
11780 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69  e file-system wi
11790 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a  ll be treated.**
117a0 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
117b0 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
117c0 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  k the next time 
117d0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
117e0 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20  on.** is opened 
117f0 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61  (by this or by a
11800 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ny other connect
11810 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ion)..*/.static 
11820 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
11830 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
11840 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
11850 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11860 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20  ER_READER .     
11870 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
11880 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
11890 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
118a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
118b0 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20  _ERROR .  );..  
118c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
118d0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
118e0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
118f0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
11900 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c   0;.  releaseAll
11910 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
11920 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72  r);..  if( pager
11930 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
11940 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
11950 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
11960 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  d) );.    sqlite
11970 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
11980 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
11990 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Wal);.    pPager
119a0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
119b0 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
119c0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
119d0 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
119e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a00 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74  * Error code ret
11a10 75 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e  urned by pagerUn
11a20 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20  lockDb() */.    
11a30 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e  int iDc = isOpen
11a40 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c  (pPager->fd)?sql
11a50 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
11a60 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
11a70 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20  er->fd):0;..    
11a80 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  /* If the operat
11a90 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
11aa0 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f  rt deletion of o
11ab0 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a  pen files, then.
11ac0 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65      ** close the
11ad0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
11ae0 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
11af0 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20  database lock.  
11b00 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
11b10 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
11b20 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
11b30 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
11b40 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ht delete the fi
11b50 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72  le.    ** out fr
11b60 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
11b70 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11b80 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11b90 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29  DE_MEMORY   & 5)
11ba0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11bb0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11bc0 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26  LMODE_OFF      &
11bd0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
11be0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11bf0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
11c00 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11c10 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11c20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
11c30 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  TE   & 5)!=1 );.
11c40 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11c50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
11c60 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
11c70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11c80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11c90 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d  E_PERSIST  & 5)=
11ca0 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =1 );.    if( 0=
11cb0 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49  =(iDc & SQLITE_I
11cc0 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
11cd0 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20  _WHEN_OPEN).    
11ce0 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e   || 1!=(pPager->
11cf0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29  journalMode & 5)
11d00 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
11d10 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
11d20 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
11d30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
11d40 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
11d50 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
11d60 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f  the call to unlo
11d70 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
11d80 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c      ** file fail
11d90 73 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65  s, set the curre
11da0 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f  nt lock to UNKNO
11db0 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65  WN_LOCK. See the
11dc0 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20   comment.    ** 
11dd0 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
11de0 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  e for UNKNOWN_LO
11df0 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
11e00 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69  ation of why thi
11e10 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65  s.    ** is nece
11e20 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
11e30 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f    rc = pagerUnlo
11e40 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f  ckDb(pPager, NO_
11e50 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
11e60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
11e70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11e80 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20  PAGER_ERROR ){. 
11e90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
11ea0 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ck = UNKNOWN_LOC
11eb0 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
11ec0 20 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65   The pager state
11ed0 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20   may be changed 
11ee0 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52  from PAGER_ERROR
11ef0 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68   to PAGER_OPEN h
11f00 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f  ere.    ** witho
11f10 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  ut clearing the 
11f20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73  error code. This
11f30 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20   is intentional 
11f40 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  - the error.    
11f50 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72  ** code is clear
11f60 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
11f70 20 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c   reset in the bl
11f80 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ock below..    *
11f90 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
11fa0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
11fb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
11fc0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
11fd0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
11fe0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
11ff0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12000 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
12010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50  ;.  }..  /* If P
12020 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20  ager.errCode is 
12030 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  set, the content
12040 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
12050 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20  ache cannot be. 
12060 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
12070 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
12080 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
12090 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
120a0 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20   pager,.  ** it 
120b0 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20  can safely move 
120c0 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50  back to PAGER_OP
120d0 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68  EN state. This h
120e0 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20  appens in both. 
120f0 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65   ** normal and e
12100 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
12110 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   mode..  */.  if
12120 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12130 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
12140 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
12150 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
12160 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
12170 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
12180 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
12190 6c 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  le;.    pPager->
121a0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
121b0 50 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  PEN;.    pPager-
121c0 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
121d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  E_OK;.  }..  pPa
121e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
121f0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 0;.  pPager->j
12200 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
12210 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
12220 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er = 0;.}../*.**
12230 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12240 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
12250 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55  r an IOERR or FU
12260 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65  LL error that re
12270 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61  quires.** the pa
12280 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f  ger to transitio
12290 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  n into the ERROR
122a0 20 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20   state may ahve 
122b0 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65  occurred..** The
122c0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
122d0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
122e0 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
122f0 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ure, the second 
12300 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  .** the error-co
12310 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
12320 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
12330 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
12340 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72   The .** value r
12350 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
12360 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
12370 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
12380 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
12390 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
123a0 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
123b0 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  TE_FULL, SQLITE_
123c0 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20  IOERR or one of 
123d0 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62  the.** IOERR sub
123e0 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65  -codes, the page
123f0 72 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52  r enters the ERR
12400 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
12410 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
12420 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  s stored in Page
12430 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65  r.errCode. While
12440 20 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69   the pager remai
12450 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  ns in the ERROR 
12460 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61  state,.** all ma
12470 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e  jor API calls on
12480 20 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20   the Pager will 
12490 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
124a0 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  rn Pager.errCode
124b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f  ..**.** The ERRO
124c0 52 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65  R state indicate
124d0 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
124e0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
124f0 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f  -cache .** canno
12500 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68  t be trusted. Th
12510 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20  is state can be 
12520 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c  cleared by compl
12530 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67  etely discarding
12540 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74   .** the content
12550 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
12560 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73  ache. If a trans
12570 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76  action was activ
12580 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65  e when.** the pe
12590 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f  rsistent error o
125a0 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
125b0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
125c0 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
125d0 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f  o be replayed to
125e0 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   restore the con
125f0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
12600 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69  abase file (as i
12610 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68  f.** it were a h
12620 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a  ot-journal)..*/.
12630 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
12640 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
12650 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
12660 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
12670 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  0xff;.  assert( 
12680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
12690 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
126a0 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67  ert(.       pPag
126b0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
126c0 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
126d0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
126e0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
126f0 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d  .       (pPager-
12700 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29  >errCode & 0xff)
12710 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
12720 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53   );.  if( rc2==S
12730 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63  QLITE_FULL || rc
12740 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  2==SQLITE_IOERR 
12750 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
12760 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
12770 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12780 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20  = PAGER_ERROR;. 
12790 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
127a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
127b0 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
127c0 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
127d0 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
127e0 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
127f0 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
12800 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
12810 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
12820 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
12830 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
12840 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
12850 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
12860 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
12870 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
12880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12890 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
128a0 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
128b0 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
128c0 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
128d0 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54  action..** .** T
128e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
128f0 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50  ever called in P
12900 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
12910 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65  . If it is calle
12920 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f  d.** in PAGER_NO
12930 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52  NE or PAGER_SHAR
12940 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  ED state and the
12950 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65   lock held is le
12960 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  ss.** exclusive 
12970 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44 20  than a RESERVED 
12980 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f  lock, it is a no
12990 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  -op..**.** Other
129a0 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65  wise, any active
129b0 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
129c0 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
129d0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
129e0 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65  ile is open, the
129f0 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a  n it is "finaliz
12a00 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72  ed". Once a jour
12a10 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73  nal .** file has
12a20 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
12a30 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
12a40 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20  le to use it to 
12a50 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20  roll back a .** 
12a60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72  transaction. Nor
12a70 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73   will it be cons
12a80 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68  idered to be a h
12a90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68  ot-journal by th
12aa0 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68  is.** or any oth
12ab0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
12ac0 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20  ection. Exactly 
12ad0 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73  how a journal is
12ae0 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65   finalized.** de
12af0 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
12b00 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65   or not the page
12b10 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
12b20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
12b30 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  nd.** the curren
12b40 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28  t journal-mode (
12b50 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
12b60 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c  e value), as fol
12b70 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  lows:.**.**   jo
12b80 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
12b90 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  Y.**     Journal
12ba0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12bb0 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65   is simply close
12bc0 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73  d. This destroys
12bd0 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d   an .**     in-m
12be0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  emory journal..*
12bf0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
12c00 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20  de==TRUNCATE.** 
12c10 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
12c20 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
12c30 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
12c40 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ize..**.**   jou
12c50 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
12c60 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72  T.**     The fir
12c70 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74  st 28 bytes of t
12c80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12c90 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73  are zeroed. This
12ca0 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20   invalidates.** 
12cb0 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f      the first jo
12cc0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
12cd0 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65  the file, and he
12ce0 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  nce the entire j
12cf0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
12d00 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a  le. An invalid j
12d10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e  ournal file cann
12d20 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
12d30 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  k..**.**   journ
12d40 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a  alMode==DELETE.*
12d50 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  *     The journa
12d60 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
12d70 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69   and deleted usi
12d80 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
12d90 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  te()..**.**     
12da0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
12db0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
12dc0 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20  sive mode, this 
12dd0 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69  method of finali
12de0 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20  zing.**     the 
12df0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12e00 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74  never used. Inst
12e10 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  ead, if the jour
12e20 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20  nalMode is.**   
12e30 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65    DELETE and the
12e40 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
12e50 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
12e60 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65   method describe
12e70 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a  d under.**     j
12e80 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12e90 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74  IST is used inst
12ea0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ead..**.** After
12eb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12ec0 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70  finalized, the p
12ed0 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41  ager moves to PA
12ee0 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65  GER_READER state
12ef0 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20  ..** If running 
12f00 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65  in non-exclusive
12f10 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20   rollback mode, 
12f20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
12f30 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e  file is .** down
12f40 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41 52  graded to a SHAR
12f50 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53  ED_LOCK..**.** S
12f60 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
12f70 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
12f80 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
12f90 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
12fa0 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65  ng.** any of the
12fb0 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   IO operations t
12fc0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
12fd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75  ournal file or u
12fe0 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  nlock the.** dat
12ff0 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49  abase then the I
13000 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
13010 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
13020 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a  user. If the .**
13030 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69   operation to fi
13040 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13050 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74  al file fails, t
13060 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69  hen the code sti
13070 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75  ll.** tries to u
13080 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
13090 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69  se file if not i
130a0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
130b0 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f  . If the.** unlo
130c0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  ck operation fai
130d0 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e  ls as well, then
130e0 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
130f0 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a   code related.**
13100 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72   to the first er
13110 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
13120 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  (the journal fin
13130 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69  alization one) i
13140 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
13150 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13160 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
13170 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
13180 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29  , int hasMaster)
13190 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
131a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
131b0 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
131c0 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
131d0 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
131e0 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
131f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
13200 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
13210 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
13220 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  peration */..  /
13230 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
13240 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
13250 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  ot have an open 
13260 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13270 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61  n.  ** or at lea
13280 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
13290 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ck. This functio
132a0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
132b0 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20  when there.  ** 
132c0 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
132d0 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62  saction active b
132e0 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ut a RESERVED or
132f0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
13300 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72  .  ** held under
13310 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
13320 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  es:.  **.  **   
13330 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65  1. After a succe
13340 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61  ssful hot-journa
13350 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
13360 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20  s called with.  
13370 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d  **      eState==
13380 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65  PAGER_NONE and e
13390 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
133a0 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  LOCK..  **.  ** 
133b0 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63    2. If a connec
133c0 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e  tion with lockin
133d0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
133e0 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
133f0 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20  USIVE .  **     
13400 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62   lock switches b
13410 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d  ack to locking_m
13420 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74  ode=normal and t
13430 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20  hen executes a. 
13440 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72   **      read-tr
13450 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
13460 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13470 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d  ed with eState==
13480 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
13490 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63  **      and eLoc
134a0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
134b0 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d  K when the read-
134c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
134d0 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  losed..  */.  as
134e0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
134f0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
13500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13510 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
13520 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  GER_ERROR );.  i
13530 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
13540 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e<PAGER_WRITER_L
13550 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d  OCKED && pPager-
13560 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f  >eLock<RESERVED_
13570 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
13580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13590 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  }..  releaseAllS
135a0 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
135b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
135c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
135d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
135e0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69  ournal==0 );.  i
135f0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
13600 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73  ->jfd) ){.    as
13610 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
13620 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
13630 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74     /* Finalize t
13640 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13650 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
13660 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
13670 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
13680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13690 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
136a0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
136b0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
136c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
136d0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
136e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
136f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13700 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13710 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
13720 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
13730 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
13750 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13770 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13780 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
13790 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
137a0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
137b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
137c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
137d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
137e0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
137f0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
13800 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
13810 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
13820 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13830 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
13840 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
13850 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
13860 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
13870 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
13880 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
13890 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
138a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
138b0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
138c0 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20  may be executed 
138d0 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e  with Pager.journ
138e0 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69  alMode==MEMORY i
138f0 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74  f.      ** a hot
13900 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73  -journal was jus
13910 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  t rolled back. I
13920 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
13930 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
13940 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
13950 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
13960 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e  ed. If this conn
13970 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f  ection writes to
13980 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
13990 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20  tabase file, it 
139a0 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67  will do so using
139b0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
139c0 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f  urnal. .      */
139d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
139e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
139f0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a00 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20  LMODE_DELETE .  
13a10 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
13a20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13a30 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13a40 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20  DE_MEMORY .     
13a50 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13a60 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13a70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13a80 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
13a90 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13aa0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13ab0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
13ac0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
13ad0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13ae0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
13af0 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
13b00 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
13b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13b20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
13b30 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
13b40 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
13b50 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
13b60 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72  ->pPCache, pager
13b70 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a  _set_pagehash);.
13b80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
13b90 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74  Size==0 && sqlit
13ba0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
13bb0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13bc0 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  )>0 ){.    PgHdr
13bd0 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b   *p = pager_look
13be0 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
13bf0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
13c00 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
13c10 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
13c20 50 61 67 65 72 55 6e 72 65 66 28 70 29 3b 0a 20  PagerUnref(p);. 
13c30 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13c40 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
13c50 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
13c60 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
13c70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13c80 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
13c90 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
13ca0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
13cb0 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
13cc0 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
13cd0 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
13ce0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
13cf0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
13d00 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
13d10 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
13d20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
13d30 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
13d40 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
13d50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
13d60 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
13d70 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
13d80 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
13d90 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
13da0 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
13db0 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
13dc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13dd0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
13de0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
13df0 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
13e00 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
13e10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
13e20 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
13e30 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
13e40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
13e50 65 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72  e .   && (!pager
13e60 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c  UseWal(pPager) |
13e70 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  | sqlite3WalExcl
13e80 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
13e90 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b  ->pWal, 0)).  ){
13ea0 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
13eb0 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
13ec0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
13ed0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
13ee0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
13ef0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53    }.  pPager->eS
13f00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
13f10 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  DER;.  pPager->s
13f20 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  etMaster = 0;.. 
13f30 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
13f40 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
13f50 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
13f60 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
13f70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13f80 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
13f90 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
13fa0 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
13fb0 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
13fc0 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
13fd0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
13fe0 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  , do not attempt
13ff0 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63   .** the rollbac
14000 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  k at this time. 
14010 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75  Instead, pager_u
14020 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  nlock() is calle
14030 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  d. The.** call t
14040 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
14050 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c   will discard al
14060 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  l in-memory page
14070 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65  s, unlock.** the
14080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
14090 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  nd move the page
140a0 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  r back to OPEN s
140b0 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a  tate. If this .*
140c0 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
140d0 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  re is a hot-jour
140e0 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20  nal left in the 
140f0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65  file-system, the
14100 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63   next .** connec
14110 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61  tion to obtain a
14120 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
14130 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68  the pager (which
14140 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65   may be this one
14150 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20  ) .** will roll 
14160 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
14170 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
14180 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65  not already ente
14190 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
141a0 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f  ate, but an IO o
141b0 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  r.** malloc erro
141c0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
141d0 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  a rollback, then
141e0 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c   this will itsel
141f0 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20  f cause .** the 
14200 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
14210 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
14220 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c  Which will be cl
14230 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  eared by the.** 
14240 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
14250 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72  lock(), as descr
14260 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73  ibed above..*/.s
14270 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
14280 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
14290 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
142a0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
142b0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
142c0 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ROR && pPager->e
142d0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
142e0 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
142f0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
14300 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
14310 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
14320 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
14330 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  TER_LOCKED ){.  
14340 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
14350 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
14360 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14370 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
14380 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
14390 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
143a0 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ();.    }else if
143b0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
143c0 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
143d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
143e0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
143f0 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20  READER );.      
14400 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
14410 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29  ction(pPager, 0)
14420 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
14430 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
14440 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
14450 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
14460 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
14470 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
14480 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
14490 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
144a0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
144b0 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
144c0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
144d0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
144e0 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
144f0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
14500 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14510 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
14520 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
14530 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
14540 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
14550 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
14560 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
14570 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
14580 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
14590 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
145a0 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
145b0 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
145c0 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
145d0 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
145e0 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
145f0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
14600 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
14610 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
14620 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
14630 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
14640 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
14650 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
14660 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
14670 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
14680 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
14690 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
146a0 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
146b0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
146c0 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
146d0 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
146e0 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
146f0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14700 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
14710 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
14720 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
14730 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
14740 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
14750 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
14760 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
14770 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
14780 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
14790 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
147a0 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
147b0 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
147c0 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
147d0 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
147e0 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
147f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
14800 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
14810 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
14820 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
14830 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
14840 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
14850 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
14860 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
14870 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
14880 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14890 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
148a0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
148b0 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
148c0 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
148d0 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
148e0 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
148f0 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
14900 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
14910 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
14920 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
14930 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
14940 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
14950 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
14960 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
14970 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
14980 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
14990 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
149a0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
149b0 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
149c0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
149d0 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
149e0 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
149f0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
14a20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
14a30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
14a40 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
14a50 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
14a60 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
14a70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
14a80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
14a90 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
14aa0 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
14ab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
14ac0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
14ad0 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
14ae0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
14af0 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
14b00 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
14b10 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
14b20 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
14b30 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
14b40 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
14b50 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
14b60 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
14b70 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
14b80 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
14b90 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
14ba0 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  ** The main roll
14bb0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
14bc0 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  s checksums - th
14bd0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
14be0 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74  nal does .** not
14bf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
14c00 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
14c10 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
14c20 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
14c30 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
14c40 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
14c50 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
14c60 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
14c70 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
14c80 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
14c90 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
14ca0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
14cb0 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
14cc0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
14cd0 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
14ce0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
14cf0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
14d00 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
14d10 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
14d20 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
14d30 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
14d40 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
14d50 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
14d60 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
14d70 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
14d80 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
14d90 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
14da0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
14db0 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
14dc0 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
14dd0 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
14de0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14df0 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
14e00 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
14e10 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
14e20 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
14e30 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
14e40 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
14e50 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
14e60 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
14e70 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
14e80 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
14e90 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
14ea0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
14eb0 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
14ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14ed0 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
14ee0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
14ef0 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
14f00 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
14f10 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
14f20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
14f30 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
14f40 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
14f50 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
14f60 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
14f70 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
14f80 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
14f90 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
14fa0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
14fb0 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
14fc0 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
14fd0 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
14fe0 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
14ff0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
15000 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
15010 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
15020 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
15030 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
15040 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
15050 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
15060 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
15070 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
15080 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
15090 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
150a0 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
150b0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
150c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
150d0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
150e0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
150f0 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
15100 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
15110 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
15120 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
15130 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
15140 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
15150 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
15160 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
15170 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
15180 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
15190 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
151a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
151c0 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
151d0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
151e0 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
15210 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
15220 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
15230 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
15240 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
15250 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
15260 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
15270 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
15280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15290 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
152a0 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
152b0 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
152c0 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
152d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
152e0 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
152f0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
15300 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
15310 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
15320 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
15330 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
15340 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
15350 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15370 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
15380 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
15390 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
153a0 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
153b0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
153c0 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
153d0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
153e0 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
15410 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
15420 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
15430 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
15440 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
15450 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
15460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15470 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
15480 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
15490 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
154a0 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
154b0 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
154c0 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
154d0 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
154e0 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
154f0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
15500 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
15510 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
15520 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
15530 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15540 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
15550 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
15560 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
15570 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
15580 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
15590 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
155a0 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
155b0 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
155c0 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
155d0 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
155e0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
155f0 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
15600 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
15610 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
15620 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
15630 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
15640 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
15650 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
15660 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
15670 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
15680 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
15690 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
156a0 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
156b0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
156c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
156d0 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
156e0 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
156f0 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
15700 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
15710 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
15720 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15730 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
15740 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
15750 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
15760 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
15770 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
15780 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
15790 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
157a0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
157b0 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
157c0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
157d0 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
157e0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
157f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15800 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
15810 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
15820 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
15830 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
15840 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
15850 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
15860 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
15870 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
15880 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15890 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
158a0 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
158b0 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
158c0 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
158d0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
158e0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
158f0 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
15900 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
15910 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
15920 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
15930 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
15940 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
15950 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
15960 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
15970 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
15980 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
15990 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
159a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
159b0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
159c0 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
159d0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
159e0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
159f0 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
15a00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15a10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
15a20 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
15a30 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
15a40 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
15a50 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
15a60 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
15a70 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
15a80 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
15a90 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
15aa0 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
15ab0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
15ac0 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
15ad0 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
15ae0 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
15af0 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
15b00 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
15b10 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
15b20 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
15b30 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
15b40 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
15b50 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
15b60 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
15b70 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
15b80 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
15b90 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
15ba0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
15bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
15bc0 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
15bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
15be0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
15bf0 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
15c00 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
15c10 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
15c20 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
15c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15c40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
15c50 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
15c60 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
15c70 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
15c80 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
15c90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15ca0 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
15cb0 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
15cc0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
15cd0 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
15ce0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15cf0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
15d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
15d10 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
15d20 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
15d30 20 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e   by before durin
15d40 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
15d50 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
15d60 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
15d70 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
15d80 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
15d90 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
15da0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
15db0 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
15dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
15de0 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
15df0 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
15e00 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
15e10 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
15e20 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
15e30 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
15e40 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
15e50 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
15e60 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
15e70 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
15e80 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
15e90 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
15ea0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
15eb0 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
15ec0 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
15ed0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
15ee0 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
15ef0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
15f00 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
15f10 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
15f20 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
15f30 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
15f40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15f50 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
15f60 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
15f70 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
15f80 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
15f90 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
15fa0 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
15fb0 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
15fc0 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
15fd0 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
15fe0 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
15ff0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
16000 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
16010 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
16020 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
16030 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
16040 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
16050 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
16060 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
16070 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
16080 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
16090 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
160a0 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
160b0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
160c0 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
160d0 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
160e0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
160f0 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
16100 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
16110 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
16120 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
16130 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
16140 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
16150 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
16160 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
16170 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
16180 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
16190 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
161a0 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
161b0 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
161c0 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
161d0 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
161e0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
161f0 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
16200 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
16210 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
16220 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
16230 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
16240 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
16250 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
16260 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
16270 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
16280 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
16290 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
162a0 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
162b0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
162c0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
162d0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
162e0 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
162f0 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
16300 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
16310 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
16320 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
16330 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
16340 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
16350 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
16360 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
16370 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
16380 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
16390 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
163a0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
163b0 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
163c0 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
163d0 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
163e0 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
163f0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
16400 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
16410 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
16420 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
16430 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
16440 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
16450 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
16460 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
16470 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
16480 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16490 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
164a0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
164b0 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
164c0 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
164d0 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
164e0 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
164f0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
16500 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
16510 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
16520 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
16530 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
16540 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
16550 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
16560 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
16570 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
16580 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
16590 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
165a0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
165b0 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
165c0 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
165d0 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
165e0 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
165f0 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
16600 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
16610 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
16620 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
16630 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
16640 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
16650 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
16660 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
16670 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
16680 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
16690 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
166a0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
166b0 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
166c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
166d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
166e0 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
166f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
16700 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
16710 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
16720 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
16730 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
16740 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16750 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
16760 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b  PEN || pPg==0 );
16770 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
16780 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
16790 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25   %d hash(%08x) %
167a0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
167b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
167c0 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
167d0 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
167e0 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44  ageSize, (u8*)aD
167f0 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ata),.          
16800 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61   (isMainJrnl?"ma
16810 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62  in-journal":"sub
16820 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b  -journal").  ));
16830 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
16840 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  l ){.    isSynce
16850 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  d = pPager->noSy
16860 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20  nc || (*pOffset 
16870 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
16880 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  alHdr);.  }else{
16890 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
168a0 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70  (pPg==0 || 0==(p
168b0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
168c0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20  R_NEED_SYNC));. 
168d0 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28   }.  if( isOpen(
168e0 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26  pPager->fd).   &
168f0 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
16900 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
16910 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
16920 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
16930 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e  PEN).   && isSyn
16940 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  ced.  ){.    i64
16950 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29   ofst = (pgno-1)
16960 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
16970 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74  geSize;.    test
16980 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74  case( !isSavepnt
16990 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70   && pPg!=0 && (p
169a0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
169b0 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b  NEED_SYNC)!=0 );
169c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
169d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
169e0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) );.    rc = sq
169f0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
16a00 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44  ger->fd, (u8*)aD
16a10 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
16a20 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
16a30 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
16a40 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
16a50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
16a60 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
16a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16a80 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
16a90 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
16aa0 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
16ab0 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
16ac0 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
16ad0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
16ae0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
16af0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
16b00 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
16b10 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
16b20 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
16b30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
16b40 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
16b50 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
16b60 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
16b70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16b80 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
16b90 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
16ba0 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
16bb0 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
16bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
16bd0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16be0 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
16bf0 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
16c00 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
16c10 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
16c20 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
16c30 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
16c40 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
16c50 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
16c60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16c70 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
16c80 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
16c90 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
16ca0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
16cb0 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
16cc0 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
16cd0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
16ce0 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
16cf0 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
16d00 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
16d10 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
16d20 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
16d30 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
16d40 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
16d50 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
16d60 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
16d70 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
16d80 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
16d90 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
16da0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
16db0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
16dc0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
16dd0 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
16de0 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
16df0 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
16e00 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
16e10 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
16e20 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
16e30 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
16e40 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
16e50 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
16e60 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
16e70 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
16e80 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
16e90 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
16ea0 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
16eb0 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
16ec0 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
16ed0 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
16ee0 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
16ef0 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
16f00 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
16f10 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ill==0 );.    pP
16f20 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
16f30 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ++;.    rc = sql
16f40 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
16f50 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
16f60 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pPg, 1);.    ass
16f70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
16f80 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20  otSpill==1 );.  
16f90 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
16fa0 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20  pill--;.    if( 
16fb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16fc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
16fd0 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
16fe0 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
16ff0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17000 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
17010 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
17020 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
17030 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
17040 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
17050 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
17060 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
17070 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
17080 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
17090 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
170a0 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
170b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
170c0 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
170d0 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
170e0 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
170f0 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
17100 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
17110 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
17120 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
17130 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
17140 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
17150 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  rRollback()..   
17160 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
17170 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  ata;.    pData =
17180 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
17190 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28   memcpy(pData, (
171a0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
171b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
171c0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
171d0 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ter(pPg);.    if
171e0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  ( isMainJrnl && 
171f0 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a  (!isSavepnt || *
17200 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d  pOffset<=pPager-
17210 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a  >journalHdr) ){.
17220 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
17230 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
17240 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20   page were just 
17250 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68  restored from th
17260 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a  e main .      **
17270 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
17280 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hen its content 
17290 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20  must be as they 
172a0 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20  were when the . 
172b0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
172c0 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70  ion was first op
172d0 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
172e0 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74  se we can mark t
172f0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
17300 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65   as clean, since
17310 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   there will be n
17320 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  o need to write 
17330 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20  it out to the.  
17340 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
17350 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17360 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
17370 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69  exception to thi
17380 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70  s rule. If the p
17390 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  age is being rol
173a0 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  led.      ** bac
173b0 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73  k as part of a s
173c0 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61  avepoint (or sta
173d0 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b  tement) rollback
173e0 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20   from an .      
173f0 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  ** unsynced port
17400 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ion of the main 
17410 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17420 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  en it is not saf
17430 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e.      ** to ma
17440 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
17450 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65  lean. This is be
17460 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68  cause marking th
17470 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20  e page as.      
17480 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c  ** clean will cl
17490 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
174a0 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69  ED_SYNC flag. Si
174b0 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a  nce the page is.
174c0 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
174d0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
174e0 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69  file (recorded i
174f0 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
17500 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  al) and.      **
17510 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
17520 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65  SYNC flag is cle
17530 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67  ared, if the pag
17540 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  e is written to.
17550 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
17560 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
17570 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  action, it will 
17580 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
17590 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  ty but.      ** 
175a0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
175b0 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f  YNC flag will no
175c0 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75  t be set. It cou
175d0 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61  ld then potentia
175e0 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  lly.      ** be 
175f0 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f  written out into
17600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17610 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f  le before its jo
17620 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20  urnal file.     
17630 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73   ** segment is s
17640 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73  ynced. If a cras
17650 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
17660 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  or following thi
17670 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  s,.      ** data
17680 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
17690 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20  may ensue..     
176a0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
176b0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
176c0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
176d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
176e0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
176f0 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
17700 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
17710 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
17720 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
17730 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
17740 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
17750 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
17760 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
17770 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
17780 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
17790 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
177a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
177b0 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
177c0 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
177d0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
177e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
177f0 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
17800 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
17810 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
17820 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
17830 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20  , pPg->pgno, 3, 
17840 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
17850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
17860 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
17870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
17890 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
178a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
178b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
178c0 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
178d0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
178e0 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
178f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17900 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
17910 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
17920 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17930 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
17940 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
17950 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
17960 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
17970 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
17980 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
17990 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
179a0 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
179b0 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
179c0 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
179d0 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
179e0 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
179f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
17a00 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
17a10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
17a20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
17a30 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
17a40 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
17a50 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
17a60 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
17a70 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
17a80 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
17a90 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
17aa0 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
17ab0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
17ac0 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
17ad0 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
17ae0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
17af0 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
17b00 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
17b10 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
17b20 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
17b30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
17b40 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
17b50 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
17b60 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
17b70 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
17b80 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
17b90 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
17ba0 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
17bb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
17bc0 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
17bd0 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
17be0 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
17bf0 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
17c00 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
17c10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
17c20 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
17c30 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
17c40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
17c50 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
17c60 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
17c70 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
17c80 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
17c90 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
17ca0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
17cb0 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
17cc0 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
17cd0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
17ce0 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
17cf0 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
17d00 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
17d10 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
17d20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
17d30 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
17d40 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a chil
17d50 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
17d60 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63   found that matc
17d70 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
17d80 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
17d90 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
17da0 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
17db0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
17dc0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
17dd0 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
17de0 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
17df0 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
17e00 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
17e10 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
17e20 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
17e30 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
17e40 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
17e50 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
17e60 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
17e70 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
17e80 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
17e90 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
17ea0 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
17eb0 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
17ec0 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
17ed0 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
17ee0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
17ef0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
17f00 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
17f10 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
17f20 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
17f30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
17f40 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
17f50 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
17f60 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
17f70 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
17f80 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
17f90 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
17fa0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17fb0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
17fc0 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
17fd0 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
17fe0 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
17ff0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
18000 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
18010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18020 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
18030 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
18040 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
18050 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
18060 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
18070 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
18080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18090 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
180a0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
180b0 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
180c0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
180d0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
180e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
180f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
18100 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
18110 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
18120 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
18130 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
18140 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
18150 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
18160 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
18170 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
18180 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
18190 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
181a0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
181b0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
181c0 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
181d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
181e0 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77  to one journal w
181f0 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f  ithin MJ file */
18200 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18210 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ptr;         /* 
18220 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a  Space to hold MJ
18230 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61   filename from a
18240 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18250 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74  .  int nMasterPt
18260 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
18270 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  Amount of space 
18280 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61  allocated to zMa
18290 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20  sterPtr[] */..  
182a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
182b0 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
182c0 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
182d0 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
182e0 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
182f0 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
18300 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18310 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
18320 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
18330 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
18340 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
18350 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
18360 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
18370 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
18380 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
18390 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
183a0 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
183b0 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
183c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
183d0 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
183e0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
183f0 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
18400 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
18410 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
18420 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d  URNAL);.    rc =
18430 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
18440 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d  Vfs, zMaster, pM
18450 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29  aster, flags, 0)
18460 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
18470 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
18480 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18490 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65  .  /* Load the e
184a0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
184b0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
184c0 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
184d0 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  om.  ** sqlite3_
184e0 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69  malloc() and poi
184f0 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
18500 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73  erJournal.   Als
18510 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75  o obtain.  ** su
18520 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28  fficient space (
18530 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74  in zMasterPtr) t
18540 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73  o hold the names
18550 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20   of master.  ** 
18560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78  journal files ex
18570 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67  tracted from reg
18580 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  ular rollback-jo
18590 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72  urnals..  */.  r
185a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
185b0 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
185c0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
185d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
185e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
185f0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61  aster_out;.  nMa
18600 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e  sterPtr = pVfs->
18610 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
18620 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
18630 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28   sqlite3Malloc((
18640 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
18650 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20  al + nMasterPtr 
18660 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61  + 1);.  if( !zMa
18670 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
18680 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
18690 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64  OMEM;.    goto d
186a0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
186b0 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d  }.  zMasterPtr =
186c0 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
186d0 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b  [nMasterJournal+
186e0 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1];.  rc = sqlit
186f0 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
18700 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
18710 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  , (int)nMasterJo
18720 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28  urnal, 0);.  if(
18730 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18740 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18750 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  out;.  zMasterJo
18760 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
18770 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a  rnal] = 0;..  zJ
18780 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
18790 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65  Journal;.  while
187a0 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
187b0 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
187c0 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
187d0 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20    int exists;.  
187e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
187f0 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f  Access(pVfs, zJo
18800 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
18810 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
18820 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72  ists);.    if( r
18830 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18840 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
18850 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
18860 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
18870 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  {.      /* One o
18880 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
18890 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
188a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
188b0 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a  exists..      **
188c0 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
188d0 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
188e0 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
188f0 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
18900 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
18910 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
18920 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18930 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  l file..      */
18940 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  .      int c;.  
18950 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
18960 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
18970 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
18980 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
18990 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
189a0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
189b0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
189c0 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
189d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
189e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
189f0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18a00 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
18a10 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
18a20 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
18a30 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
18a40 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
18a50 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
18a60 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
18a70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18a80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18a90 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18aa0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
18ab0 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
18ac0 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
18ad0 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
18ae0 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
18af0 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
18b00 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
18b10 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
18b20 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
18b30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
18b40 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  /.        goto d
18b50 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18b60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18b70 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c  zJournal += (sql
18b80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f  ite3Strlen30(zJo
18b90 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20  urnal)+1);.  }. 
18ba0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
18bb0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63  e(pMaster);.  rc
18bc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
18bd0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
18be0 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  , 0);..delmaster
18bf0 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  _out:.  sqlite3_
18c00 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
18c10 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73  nal);.  if( pMas
18c20 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
18c30 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
18c40 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
18c50 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c  !isOpen(pJournal
18c60 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
18c70 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
18c80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18c90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
18ca0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
18cb0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61   to change the a
18cc0 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
18cd0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
18ce0 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
18cf0 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c  system. This onl
18d00 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
18d10 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
18d20 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72  saction,.** or r
18d30 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
18d40 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75  ansaction (inclu
18d50 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63  ding rolling bac
18d60 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  k a hot-journal)
18d70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ..**.** If the m
18d80 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
18d90 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
18da0 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  r the pager is n
18db0 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  ot in either.** 
18dc0 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74  DBMOD or OPEN st
18dd0 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
18de0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
18df0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69  therwise, the si
18e00 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  ze .** of the fi
18e10 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  le is changed to
18e20 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
18e30 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
18e40 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a  Size bytes). .**
18e50 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   If the file on 
18e60 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
18e70 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
18e80 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
18e90 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
18ea0 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
18eb0 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
18ec0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
18ed0 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
18ee0 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
18ef0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
18f00 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
18f10 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
18f20 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
18f30 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
18f40 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
18f50 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
18f60 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
18f70 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
18f80 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
18f90 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
18fa0 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
18fb0 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
18fc0 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
18fd0 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
18fe0 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
18ff0 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
19000 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
19010 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
19020 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
19030 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
19040 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
19050 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
19060 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
19070 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
19080 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
19090 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
190a0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
190b0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
190c0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
190d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
190e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
190f0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
19100 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
19110 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
19120 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
19130 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28    .  if( isOpen(
19140 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20  pPager->fd) .   
19150 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
19160 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
19170 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
19180 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
19190 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20  OPEN) .  ){.    
191a0 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
191b0 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e   newSize;.    in
191c0 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65  t szPage = pPage
191d0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
191e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
191f0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
19200 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a  E_LOCK );.    /*
19210 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
19220 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
19230 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
19240 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
19250 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
19260 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
19270 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
19280 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69  Size = szPage*(i
19290 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66  64)nPage;.    if
192a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
192b0 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d  && currentSize!=
192c0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
192d0 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65   if( currentSize
192e0 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  >newSize ){.    
192f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19300 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
19310 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b  r->fd, newSize);
19320 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
19330 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a   (currentSize+sz
19340 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29  Page)<=newSize )
19350 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
19360 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70  pTmp = pPager->p
19370 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  TmpSpace;.      
19380 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30    memset(pTmp, 0
19390 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  , szPage);.     
193a0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
193b0 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d  wSize-szPage) ==
193c0 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
193d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
193e0 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
193f0 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a  e) >  currentSiz
19400 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  e );.        rc 
19410 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
19420 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d  (pPager->fd, pTm
19430 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69  p, szPage, newSi
19440 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  ze-szPage);.    
19450 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
19460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19470 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
19480 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
19490 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
194a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
194b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
194c0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
194d0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
194e0 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
194f0 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
19500 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
19510 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
19520 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
19530 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
19540 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
19550 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
19560 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
19570 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  d used .** to de
19580 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
19590 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
195a0 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
195b0 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
195c0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
195d0 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
195e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
195f0 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
19600 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
19610 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
19620 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
19630 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
19640 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
19650 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
19660 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
19670 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
19680 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
19690 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
196a0 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
196b0 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33   rounded up to 3
196c0 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
196d0 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72  ss than 32, or r
196e0 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d  ounded down to M
196f0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
19700 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  f it.** is great
19710 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54  er than MAX_SECT
19720 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49  OR_SIZE..**.** I
19730 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74  f the file has t
19740 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
19750 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
19760 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68  ITE property, th
19770 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66  en set.** the ef
19780 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
19790 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ize to its minim
197a0 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20  um value (512). 
197b0 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a   The purpose of.
197c0 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ** pPager->secto
197d0 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69  rSize is to defi
197e0 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61  ne the "blast ra
197f0 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74  dius" of bytes t
19800 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
19810 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f  nge if a crash o
19820 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74  ccurs while writ
19830 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ing to a single 
19840 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20  byte in.** that 
19850 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68  range.  But with
19860 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
19870 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20  RITE, the blast 
19880 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a  radius is zero.*
19890 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20  * (that is what 
198a0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
198b0 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77  ITE means), so w
198c0 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73  e minimize the s
198d0 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20  ector.** size.  
198e0 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f  For backwards co
198f0 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74  mpatibility of t
19900 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
19910 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c  nal file format,
19920 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65  .** we cannot re
19930 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
19940 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62  ve sector size b
19950 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61  elow 512..*/.sta
19960 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
19970 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
19980 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
19990 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
199a0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
199b0 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66  empFile );..  if
199c0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
199d0 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  le.   || (sqlite
199e0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
199f0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
19a00 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20  >fd) & .        
19a10 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
19a20 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
19a30 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a  RWRITE)!=0.  ){.
19a40 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
19a50 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
19a60 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
19a70 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
19a80 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
19a90 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
19aa0 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
19ab0 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
19ac0 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
19ad0 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
19ae0 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50  fault. */.    pP
19af0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
19b00 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b   = 512;.  }else{
19b10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
19b20 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
19b30 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
19b40 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69  ager->fd);.    i
19b50 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
19b60 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20  rSize<32 ){.    
19b70 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
19b80 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20  Size = 512;.    
19b90 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
19ba0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58  ->sectorSize>MAX
19bb0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
19bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 41        assert( MA
19bd0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
19be0 31 32 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  12 );.      pPag
19bf0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
19c00 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
19c20 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
19c30 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
19c40 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
19c50 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
19c60 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
19c70 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
19c80 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
19c90 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
19ca0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
19cb0 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
19cc0 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
19cd0 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
19ce0 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
19cf0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
19d00 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
19d10 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
19d20 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
19d30 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
19d40 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
19d50 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
19d60 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
19d70 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
19d80 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
19d90 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
19da0 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
19db0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
19dc0 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
19dd0 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
19de0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
19df0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
19e00 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
19e10 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
19e20 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
19e30 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
19e40 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
19e50 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
19e60 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
19e70 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
19e80 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
19e90 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
19ea0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
19eb0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
19ec0 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
19ed0 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
19ee0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
19ef0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
19f00 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
19f10 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
19f20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
19f30 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
19f40 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
19f50 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
19f60 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
19f70 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
19f80 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
19f90 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
19fa0 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
19fb0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
19fc0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
19fd0 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
19fe0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
19ff0 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
1a000 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1a010 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
1a020 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
1a030 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1a040 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
1a050 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
1a060 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
1a070 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
1a080 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
1a090 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
1a0a0 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
1a0b0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
1a0c0 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
1a0d0 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
1a0e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1a0f0 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
1a100 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
1a110 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
1a120 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
1a130 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
1a140 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
1a150 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1a160 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
1a170 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
1a180 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
1a190 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
1a1a0 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
1a1b0 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
1a1c0 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
1a1d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1a1e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1a1f0 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
1a200 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
1a210 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
1a220 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
1a230 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
1a240 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
1a250 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
1a260 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
1a270 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
1a280 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
1a290 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
1a2a0 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
1a2b0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
1a2c0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1a2d0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1a2e0 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
1a2f0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1a300 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
1a310 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
1a320 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
1a330 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
1a340 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
1a350 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
1a360 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
1a370 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
1a380 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
1a390 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
1a3a0 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
1a3b0 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
1a3c0 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
1a3d0 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
1a3e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1a3f0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
1a400 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
1a410 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
1a420 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
1a430 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
1a440 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1a450 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
1a460 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
1a470 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
1a480 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
1a490 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
1a4a0 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
1a4b0 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
1a4c0 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
1a4d0 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
1a4e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
1a4f0 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
1a500 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
1a510 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
1a520 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1a530 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
1a540 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
1a550 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
1a560 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
1a570 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
1a580 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
1a590 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
1a5a0 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
1a5b0 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
1a5c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1a5d0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
1a5e0 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
1a5f0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1a600 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
1a610 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
1a620 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
1a630 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
1a640 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
1a650 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
1a660 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
1a670 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
1a680 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
1a690 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
1a6a0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
1a6b0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1a6c0 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
1a6d0 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
1a6e0 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
1a6f0 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
1a700 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
1a710 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
1a720 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
1a730 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
1a740 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
1a750 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
1a760 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1a770 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
1a780 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1a790 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1a7a0 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a7c0 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
1a7d0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
1a7e0 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
1a810 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
1a820 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a840 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1a850 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1a860 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
1a870 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1a880 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1a890 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
1a8a0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a8c0 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
1a8d0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1a8e0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
1a8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1a900 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
1a910 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
1a920 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
1a930 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
1a940 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
1a950 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1a960 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
1a970 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
1a980 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
1a990 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
1a9a0 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
1a9b0 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46  lback */..  /* F
1a9c0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1a9d0 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
1a9e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1a9f0 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
1aa00 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
1aa10 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
1aa20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1aa30 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
1aa40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1aa50 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1aa60 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
1aa70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1aa80 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1aa90 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
1aaa0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
1aab0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
1aac0 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
1aad0 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
1aae0 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
1aaf0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1ab00 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
1ab10 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
1ab20 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
1ab30 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
1ab40 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1ab50 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
1ab60 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1ab70 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
1ab80 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   back..  **.  **
1ab90 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c   TODO: Technical
1aba0 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
1abb0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63   is an error bec
1abc0 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20  ause it assumes 
1abd0 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  that.  ** buffer
1abe0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
1abf0 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b   is (mxPathname+
1ac00 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67  1) bytes or larg
1ac10 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20  er. i.e. that.  
1ac20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ** (pPager->page
1ac30 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e  Size >= pPager->
1ac40 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1ac50 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e  +1). Using os_un
1ac60 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61  ix.c,.  **  mxPa
1ac70 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77  thname is 512, w
1ac80 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
1ac90 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   as the minimum 
1aca0 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a  allowable value.
1acb0 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a    ** for pageSiz
1acc0 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  e..  */.  zMaste
1acd0 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1ace0 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
1acf0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1ad00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1ad10 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1ad20 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1ad30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1ad40 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1ad50 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
1ad60 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1ad70 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1ad80 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1ad90 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
1ada0 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
1adb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1adc0 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
1add0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1ade0 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
1adf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1ae00 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52   0;.  needPagerR
1ae10 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20  eset = isHot;.. 
1ae20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
1ae30 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
1ae40 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e  when a readJourn
1ae50 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a  alHdr() or .  **
1ae60 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1ae70 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20  one_page() call 
1ae80 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1ae90 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
1aea0 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e  or .  ** occurs.
1aeb0 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
1aec0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64  1 ){.    /* Read
1aed0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
1aee0 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
1aef0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1af00 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
1af10 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
1af20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
1af30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1af40 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
1af50 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
1af60 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
1af70 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
1af80 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1af90 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
1afa0 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
1afb0 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
1afc0 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
1afd0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
1afe0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
1aff0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
1b000 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a  ager, isHot, szJ
1b010 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
1b020 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b030 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
1b040 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b050 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1b060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1b080 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1b090 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1b0a0 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
1b0b0 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
1b0c0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
1b0d0 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1b0e0 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
1b0f0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
1b100 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1b110 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1b120 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1b130 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
1b140 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
1b150 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
1b160 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
1b170 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
1b180 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
1b190 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
1b1a0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1b1b0 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
1b1c0 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
1b1d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1b1e0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1b1f0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1b200 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
1b210 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a  = (int)((szJ - J
1b220 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1b230 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
1b240 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1b250 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1b260 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
1b270 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
1b280 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1b290 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
1b2a0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
1b2b0 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
1b2c0 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
1b2d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
1b2e0 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
1b2f0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
1b300 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1b310 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
1b320 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
1b330 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
1b340 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
1b350 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
1b360 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
1b370 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
1b380 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
1b390 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
1b3a0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
1b3b0 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
1b3c0 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
1b3d0 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
1b3e0 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20  65..    ** When 
1b3f0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
1b400 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63  ot journal, nRec
1b410 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73  ==0 always means
1b420 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20   that the next. 
1b430 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74     ** chunk of t
1b440 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
1b450 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74  ins zero pages t
1b460 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b470 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68  .  But.    ** wh
1b480 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42  en doing a ROLLB
1b490 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63  ACK and the nRec
1b4a0 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65  ==0 chunk is the
1b4b0 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20   last chunk in. 
1b4c0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
1b4d0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1b4e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1b4f0 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74  ht contain addit
1b500 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67  ional.    ** pag
1b510 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
1b520 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
1b530 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  nd that the numb
1b540 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20  er of pages .   
1b550 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f   ** should be co
1b560 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20  mputed based on 
1b570 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b580 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1b590 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
1b5a0 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
1b5b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1b5c0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
1b5d0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
1b5e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b5f0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
1b600 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
1b610 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b620 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
1b630 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1b640 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1b650 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
1b660 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
1b670 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
1b680 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
1b690 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1b6a0 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
1b6b0 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
1b6c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1b6d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1b6e0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1b6f0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
1b700 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
1b710 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
1b720 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b730 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b740 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1b750 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
1b760 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1b770 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
1b780 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
1b790 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
1b7a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b7b0 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
1b7c0 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
1b7d0 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
1b7e0 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
1b7f0 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
1b800 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
1b810 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
1b820 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
1b830 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1b840 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
1b850 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
1b860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b870 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1b880 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
1b890 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75  ger,&pPager->jou
1b8a0 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a  rnalOff,0,1,0);.
1b8b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b8c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b8d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b8e0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1b8f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b900 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
1b910 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b920 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1b930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1b940 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1b950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1b960 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
1b970 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
1b980 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
1b990 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
1b9a0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1b9b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
1b9c0 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
1b9d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1b9e0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
1b9f0 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
1ba00 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
1ba10 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
1ba20 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
1ba30 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
1ba40 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
1ba50 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
1ba60 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
1ba70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
1ba80 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
1ba90 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
1baa0 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
1bab0 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
1bac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bad0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1bae0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1baf0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1bb00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1bb10 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1bb20 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
1bb30 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
1bb40 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1bb50 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
1bb60 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
1bb70 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
1bb80 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
1bb90 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
1bba0 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
1bbb0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
1bbc0 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
1bbd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1bbe0 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
1bbf0 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
1bc00 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1bc10 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
1bc20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1bc30 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1bc40 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
1bc50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1bc60 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
1bc70 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
1bc80 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
1bc90 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
1bca0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
1bcb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1bcc0 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
1bcd0 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
1bce0 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
1bcf0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1bd00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
1bd10 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
1bd20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1bd30 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
1bd40 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
1bd50 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
1bd60 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
1bd70 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1bd80 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
1bd90 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66  dified..  */.#if
1bda0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1bdb0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
1bdc0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1bdd0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
1bde0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
1bdf0 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
1be00 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1be10 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ,0);.  }.#endif.
1be20 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c  .  /* If this pl
1be30 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e  ayback is happen
1be40 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ing automaticall
1be50 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  y as a result of
1be60 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20   an IO or .  ** 
1be70 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61  malloc error tha
1be80 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72  t occurred after
1be90 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1bea0 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
1beb0 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65  but .  ** before
1bec0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1bed0 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20   was committed, 
1bee0 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d  then the change-
1bef0 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f  counter .  ** mo
1bf00 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a  dification may j
1bf10 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
1bf20 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20  verted. If this 
1bf30 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75  happens in exclu
1bf40 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c  sive .  ** mode,
1bf50 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74   then subsequent
1bf60 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65   transactions pe
1bf70 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63  rformed by the c
1bf80 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e  onnection will n
1bf90 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74  ot.  ** update t
1bfa0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1bfb0 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d  r at all. This m
1bfc0 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65  ay lead to cache
1bfd0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20   inconsistency. 
1bfe0 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72   ** problems for
1bff0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1c000 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   at some point i
1c010 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f  n the future. So
1c020 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63  , just.  ** in c
1c030 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70  ase this has hap
1c040 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65  pened, clear the
1c050 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
1c060 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a   flag now..  */.
1c070 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1c080 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
1c090 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
1c0a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c0b0 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
1c0c0 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1c0d0 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
1c0e0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
1c0f0 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
1c100 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
1c110 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1c120 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  +1);.    testcas
1c130 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1c140 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1c150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
1c160 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1c170 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1c180 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1c190 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1c1a0 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  PEN).  ){.    rc
1c1b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1c1c0 79 6e 63 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ync(pPager);.  }
1c1d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c1e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1c1f0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1c200 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
1c210 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
1c220 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1c240 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1c250 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1c260 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1c270 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1c280 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1c290 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1c2a0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1c2b0 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1c2c0 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1c2d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1c2e0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1c2f0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1c300 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1c310 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1c320 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1c330 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1c340 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
1c350 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
1c360 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1c370 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
1c380 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
1c390 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
1c3a0 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
1c3b0 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
1c3c0 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
1c3d0 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
1c3e0 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
1c3f0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
1c400 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
1c410 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
1c420 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1c430 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1c440 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1c450 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1c460 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1c470 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c480 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
1c490 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
1c4a0 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
1c4b0 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
1c4c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1c4d0 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
1c4e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1c4f0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
1c500 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
1c510 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1c520 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
1c530 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
1c540 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1c550 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
1c560 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1c570 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1c580 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1c590 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
1c5a0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1c5b0 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
1c5c0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
1c5d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1c5e0 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1c5f0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
1c600 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1c610 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1c620 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1c630 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1c640 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1c650 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1c660 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1c670 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1c680 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1c690 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1c6a0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1c6b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57  e */.  int isInW
1c6c0 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  al = 0;         
1c6d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
1c6e0 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69  age is in log fi
1c6f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a  le */.  int pgsz
1c700 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
1c710 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ize; /* Number o
1c720 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
1c730 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1c740 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1c750 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d  GER_READER && !M
1c760 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
1c770 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1c780 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e  >fd) );..  if( N
1c790 45 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61  EVER(!isOpen(pPa
1c7a0 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20  ger->fd)) ){.   
1c7b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c7c0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1c7d0 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
1c7e0 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
1c7f0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65  ageSize);.    re
1c800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c810 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
1c820 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1c830 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20  {.    /* Try to 
1c840 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72  pull the page fr
1c850 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  om the write-ahe
1c860 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72  ad log. */.    r
1c870 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65  c = sqlite3WalRe
1c880 61 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  ad(pPager->pWal,
1c890 20 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c   pgno, &isInWal,
1c8a0 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74   pgsz, pPg->pDat
1c8b0 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  a);.  }.  if( rc
1c8c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1c8d0 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69  isInWal ){.    i
1c8e0 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67  64 iOffset = (pg
1c8f0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
1c900 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1c910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1c920 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1c930 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a  pPg->pData, pgsz
1c940 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
1c950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1c960 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1c970 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1c980 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1c990 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   }..  if( pgno==
1c9a0 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20  1 ){.    if( rc 
1c9b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1c9c0 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63  he read is unsuc
1c9d0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
1c9e0 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f   dbFileVers[] to
1c9f0 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20   something.     
1ca00 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65   ** that will ne
1ca10 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66  ver be a valid f
1ca20 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62  ile version.  db
1ca30 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20  FileVers[] is a 
1ca40 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66  copy.      ** of
1ca50 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66   bytes 24..39 of
1ca60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1ca70 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f  Bytes 28..31 sho
1ca80 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20  uld always be.  
1ca90 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74      ** zero or t
1caa0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1cab0 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e  atabase in page.
1cac0 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e   Bytes 32..35 an
1cad0 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a  d 35..39.      *
1cae0 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65  * should be page
1caf0 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
1cb00 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66  re never 0xfffff
1cb10 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67  fff.  So filling
1cb20 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72  .      ** pPager
1cb30 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77  ->dbFileVers[] w
1cb40 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74  ith all 0xff byt
1cb50 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63  es should suffic
1cb60 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
1cb70 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72    ** For an encr
1cb80 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20  ypted database, 
1cb90 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73  the situation is
1cba0 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20   more complex:  
1cbb0 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32  bytes.      ** 2
1cbc0 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1cbd0 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20  abase are white 
1cbe0 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20  noise.  But the 
1cbf0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20  probability of. 
1cc00 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f       ** white no
1cc10 69 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31  ising equaling 1
1cc20 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20  6 bytes of 0xff 
1cc30 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73  is vanishingly s
1cc40 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a  mall so.      **
1cc50 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   we should still
1cc60 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f   be ok..      */
1cc70 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
1cc80 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1cc90 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70  , 0xff, sizeof(p
1cca0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1ccb0 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s));.    }else{.
1ccc0 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65        u8 *dbFile
1ccd0 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50  Vers = &((u8*)pP
1cce0 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20  g->pData)[24];. 
1ccf0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1cd00 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1cd10 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
1cd20 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1cd30 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
1cd40 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
1cd50 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
1cd60 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53   pgno, 3, rc = S
1cd70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20  QLITE_NOMEM);.. 
1cd80 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1cd90 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1cda0 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1cdb0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1cdc0 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1cdd0 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1cde0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1cdf0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
1ce00 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
1ce10 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1ce30 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1ce40 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1ce50 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
1ce60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ce70 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76  .** Update the v
1ce80 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e  alue of the chan
1ce90 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66  ge-counter at of
1cea0 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20  fsets 24 and 92 
1ceb0 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  in.** the header
1cec0 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20   and the sqlite 
1ced0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61  version number a
1cee0 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a  t offset 96..**.
1cef0 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e  ** This is an un
1cf00 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61  conditional upda
1cf10 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68  te.  See also th
1cf20 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  e pager_incr_cha
1cf30 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20  ngecounter().** 
1cf40 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e  routine which on
1cf50 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1cf60 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66  hange-counter if
1cf70 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61   the update is a
1cf80 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65  ctually.** neede
1cf90 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64  d, as determined
1cfa0 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e   by the pPager->
1cfb0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1cfc0 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a  state variable..
1cfd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1cfe0 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1cff0 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a  ecounter(PgHdr *
1d000 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e  pPg){.  u32 chan
1d010 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f  ge_counter;..  /
1d020 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1d030 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1d040 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1d050 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1d060 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
1d070 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
1d080 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50  yte((u8*)pPg->pP
1d090 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d0a0 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73  )+1;.  put32bits
1d0b0 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1d0c0 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  ata)+24, change_
1d0d0 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  counter);..  /* 
1d0e0 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
1d0f0 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
1d100 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
1d110 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a  ..99 and in.  **
1d120 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
1d130 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
1d140 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
1d150 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
1d160 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69  ber.  ** is vali
1d170 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  d. */.  put32bit
1d180 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1d190 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65  Data)+92, change
1d1a0 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74  _counter);.  put
1d1b0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1d1c0 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53  Pg->pData)+96, S
1d1d0 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
1d1e0 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  MBER);.}..#ifnde
1d1f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1d200 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  L./*.** This fun
1d210 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
1d220 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
1d230 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  age that has alr
1d240 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72  eady been .** wr
1d250 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c  itten into the l
1d260 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57  og file when a W
1d270 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1d280 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1d290 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20  * Parameter iPg 
1d2a0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
1d2b0 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e  er of said page.
1d2c0 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65   The pCtx argume
1d2d0 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c  nt .** is actual
1d2e0 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
1d2f0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1d300 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ure..**.** If pa
1d310 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e  ge iPg is presen
1d320 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  t in the cache, 
1d330 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  and has no outst
1d340 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
1d350 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63  s,.** it is disc
1d360 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65  arded. Otherwise
1d370 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  , if there are o
1d380 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
1d390 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65  anding.** refere
1d3a0 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63  nces, the page c
1d3b0 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64  ontent is reload
1d3c0 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1d3d0 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  base. If the.** 
1d3e0 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61  attempt to reloa
1d3f0 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
1d400 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72  he database is r
1d410 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c  equired and fail
1d420 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  s, .** return an
1d430 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1d440 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
1d450 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
1d460 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64  tic int pagerUnd
1d470 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  oCallback(void *
1d480 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b  pCtx, Pgno iPg){
1d490 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d4a0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1d4b0 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
1d4c0 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20  *)pCtx;.  PgHdr 
1d4d0 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73  *pPg;..  pPg = s
1d4e0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1d4f0 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a  p(pPager, iPg);.
1d500 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
1d510 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63   if( sqlite3Pcac
1d520 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
1d530 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Pg)==1 ){.      
1d540 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
1d550 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  p(pPg);.    }els
1d560 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  e{.      rc = re
1d570 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
1d580 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d5a0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1d5b0 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1d5c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1d5d0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1d5e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1d5f0 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74  Normally, if a t
1d600 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1d610 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62  lled back, any b
1d620 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1d630 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64  are.  ** updated
1d640 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69   as data is copi
1d650 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f  ed out of the ro
1d660 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
1d670 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  nd into the.  **
1d680 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
1d690 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79  is not generally
1d6a0 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61   possible with a
1d6b0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61   WAL database, a
1d6c0 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  s.  ** rollback 
1d6d0 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20  involves simply 
1d6e0 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c  truncating the l
1d6f0 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f  og file. Therefo
1d700 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  re, if one.  ** 
1d710 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68  or more frames h
1d720 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1d730 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1d740 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f  log (and therefo
1d750 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f  re .  ** also co
1d760 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61  pied into the ba
1d770 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20  ckup databases) 
1d780 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
1d790 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a  transaction,.  *
1d7a0 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75  * the backups mu
1d7b0 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  st be restarted.
1d7c0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
1d7d0 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
1d7e0 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a  ger->pBackup);..
1d7f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d800 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d810 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1d820 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   rollback a tran
1d830 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c  saction on a WAL
1d840 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1d850 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f  atic int pagerRo
1d860 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20  llbackWal(Pager 
1d870 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1d880 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1d890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d8a0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
1d8b0 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20  PgHdr *pList;   
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8d0 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79  /* List of dirty
1d8e0 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74   pages to revert
1d8f0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c   */..  /* For al
1d900 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  l pages in the c
1d910 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75  ache that are cu
1d920 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72  rrently dirty or
1d930 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
1d940 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
1d950 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74  (but not committ
1d960 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ed) to the log f
1d970 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74  ile, do one of t
1d980 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  he .  ** followi
1d990 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ng:.  **.  **   
1d9a0 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  + Discard the ca
1d9b0 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65  ched page (if re
1d9c0 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20  fcount==0), or. 
1d9d0 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70   **   + Reload p
1d9e0 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  age content from
1d9f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
1da00 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20  f refcount>0).. 
1da10 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
1da20 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1da30 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20  bOrigSize;.  rc 
1da40 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f  = sqlite3WalUndo
1da50 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1da60 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1da70 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
1da80 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
1da90 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1daa0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1dab0 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  che);.  while( p
1dac0 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
1dad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
1dae0 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
1daf0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72  t->pDirty;.    r
1db00 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  c = pagerUndoCal
1db10 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50  lback((void *)pP
1db20 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
1db30 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  o);.    pList = 
1db40 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNext;.  }..  re
1db50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1db60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1db70 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
1db80 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72  und sqlite3WalFr
1db90 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20  ames(). As well 
1dba0 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68  as logging.** th
1dbb0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1dbc0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1dbd0 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20  headed by pList 
1dbe0 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44  (connected by pD
1dbf0 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66  irty),.** this f
1dc00 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73  unction notifies
1dc10 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b   any active back
1dc20 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61  up processes tha
1dc30 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65  t the pages have
1dc40 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  .** changed. .**
1dc50 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  .** The list of 
1dc60 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74  pages passed int
1dc70 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1dc80 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20  s always sorted 
1dc90 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  by page number..
1dca0 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67  ** Hence, if pag
1dcb0 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77  e 1 appears anyw
1dcc0 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  here on the list
1dcd0 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65  , it will be the
1dce0 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20   first page..*/ 
1dcf0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1dd00 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61  rWalFrames(.  Pa
1dd10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd30 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1dd40 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c  .  PgHdr *pList,
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1dd70 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20  ames to log */. 
1dd80 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c   Pgno nTruncate,
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1ddb0 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d  e after this com
1ddc0 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  mit */.  int isC
1ddd0 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1dde0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1ddf0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
1de00 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mmit */.){.  int
1de10 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de30 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 23  Return code */.#
1de40 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1de50 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1de60 6e 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b  ned(SQLITE_CHECK
1de70 5f 50 41 47 45 53 29 0a 20 20 50 67 48 64 72 20  _PAGES).  PgHdr 
1de80 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1de90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1dea0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61   looping over pa
1deb0 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ges */.#endif.. 
1dec0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ded0 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  >pWal );.  asser
1dee0 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64  t( pList );.#ifd
1def0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1df00 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1df10 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69   the page list i
1df20 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
1df30 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  rder */.  for(p=
1df40 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70  pList; p && p->p
1df50 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72  Dirty; p=p->pDir
1df60 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
1df70 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44   p->pgno < p->pD
1df80 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  irty->pgno );.  
1df90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
1dfa0 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
1dfb0 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e  /* If a WAL tran
1dfc0 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
1dfd0 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72   committed, ther
1dfe0 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1dff0 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20   writing.    ** 
1e000 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70  any pages with p
1e010 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
1e020 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61  ter than nTrunca
1e030 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20  te into the WAL 
1e040 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  file..    ** The
1e050 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
1e060 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65  read by any clie
1e070 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68  nt. So remove th
1e080 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72  em from the pDir
1e090 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68  ty.    ** list h
1e0a0 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64  ere. */.    PgHd
1e0b0 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20  r *p;.    PgHdr 
1e0c0 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73  **ppNext = &pLis
1e0d0 74 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  t;.    for(p=pLi
1e0e0 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70  st; (*ppNext = p
1e0f0 29 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  ); p=p->pDirty){
1e100 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67  .      if( p->pg
1e110 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 20  no<=nTruncate ) 
1e120 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69  ppNext = &p->pDi
1e130 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  rty;.    }.    a
1e140 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1e150 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74    }..  if( pList
1e160 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1e170 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1e180 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1e190 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1e1a0 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1e1b0 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1e1c0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1e1d0 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1e1e0 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d  sCommit, pPager-
1e1f0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20  >walSyncFlags.  
1e200 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1e210 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1e220 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
1e230 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
1e240 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1e250 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1e260 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
1e270 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
1e280 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c  Backup, p->pgno,
1e290 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29   (u8 *)p->pData)
1e2a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
1e2b0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1e2c0 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d  _PAGES.  pList =
1e2d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
1e2e0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
1e2f0 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28  pPCache);.  for(
1e300 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1e310 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61  >pDirty){.    pa
1e320 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
1e330 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (p);.  }.#endif.
1e340 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e350 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72  ./*.** Begin a r
1e360 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
1e370 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a  on the WAL..**.*
1e380 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
1e390 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  sed to be called
1e3a0 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73   "pagerOpenSnaps
1e3b0 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69  hot()" because i
1e3c0 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a  t essentially.**
1e3d0 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f   makes a snapsho
1e3e0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1e3f0 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  e at the current
1e400 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61   point in time a
1e410 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20  nd preserves.** 
1e420 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f  that snapshot fo
1e430 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61  r use by the rea
1e440 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20  der in spite of 
1e450 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61  concurrently cha
1e460 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72  nges by.** other
1e470 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63   writers or chec
1e480 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74  kpointers..*/.st
1e490 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65  atic int pagerBe
1e4a0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1e4b0 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
1e4c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1e4f0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61  ode */.  int cha
1e500 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  nged = 0;       
1e510 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e520 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62   if cache must b
1e530 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73  e reset */..  as
1e540 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1e550 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
1e560 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1e570 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1e580 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
1e590 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
1e5a0 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  R );..  /* sqlit
1e5b0 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1e5c0 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
1e5d0 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
1e5e0 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
1e5f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
1e600 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
1e610 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
1e620 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
1e630 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
1e640 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
1e650 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
1e660 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
1e670 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
1e680 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
1e690 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
1e6a0 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1e6b0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1e6c0 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
1e6d0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
1e6e0 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1e6f0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
1e700 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
1e710 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1e720 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  | changed ){.   
1e730 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1e740 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ger);.  }..  ret
1e750 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1e760 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e770 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1e780 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
1e790 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
1e7a0 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
1e7b0 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
1e7c0 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
1e7d0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e7e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1e7f0 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
1e800 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
1e810 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
1e820 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
1e830 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
1e840 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1e850 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1e860 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1e870 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1e880 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
1e890 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
1e8a0 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
1e8b0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
1e8c0 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
1e8d0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
1e8e0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1e8f0 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
1e900 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
1e910 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
1e920 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1e930 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
1e940 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1e950 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1e960 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1e970 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
1e980 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
1e990 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
1e9a0 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
1e9b0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
1e9c0 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
1e9d0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
1e9e0 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
1e9f0 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
1ea00 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
1ea10 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
1ea20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1ea30 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
1ea40 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
1ea50 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
1ea60 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
1ea70 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1ea80 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
1ea90 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
1eaa0 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
1eab0 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
1eac0 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
1ead0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1eae0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1eaf0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1eb00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1eb10 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1eb20 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  OCK );.  nPage =
1eb30 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
1eb40 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
1eb50 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
1eb60 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
1eb70 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72  not available fr
1eb80 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1eb90 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65  ystem,.  ** dete
1eba0 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f  rmine it based o
1ebb0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1ebc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1ebd0 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a   If the size.  *
1ebe0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
1ebf0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
1ec00 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
1ec10 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  e of the page-si
1ec20 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64  ze,.  ** round d
1ec30 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65  own to the neare
1ec40 73 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c  st page. Except,
1ec50 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72   any file larger
1ec60 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74   than 0.  ** byt
1ec70 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
1ec80 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74  nsidered to cont
1ec90 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
1eca0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1ecb0 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
1ecc0 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ece0 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69  /* Size of db fi
1ecf0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1ed00 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
1ed10 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1ed20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1ed30 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
1ed40 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1ed50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
1ed60 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1ed70 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1ed80 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  &n);.      if( r
1ed90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1eda0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1edb0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1edc0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67  .    nPage = (Pg
1edd0 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70  no)((n+pPager->p
1ede0 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61  ageSize-1) / pPa
1edf0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1ee00 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1ee10 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
1ee20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1ee30 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
1ee40 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f  than the.  ** co
1ee50 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d  nfigured maximum
1ee60 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69   pager number, i
1ee70 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
1ee80 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a  wed limit so.  *
1ee90 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  * that the file 
1eea0 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a  can be read..  *
1eeb0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50  /.  if( nPage>pP
1eec0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
1eed0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
1eee0 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65  no = (Pgno)nPage
1eef0 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65  ;.  }..  *pnPage
1ef00 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
1ef10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1ef20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ef30 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43  OMIT_WAL./*.** C
1ef40 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61  heck if the *-wa
1ef50 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72  l file that corr
1ef60 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64  esponds to the d
1ef70 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1ef80 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73  y pPager.** exis
1ef90 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ts if the databa
1efa0 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20  se is not empy, 
1efb0 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74  or verify that t
1efc0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
1efd0 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20  es.** not exist 
1efe0 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29  (by deleting it)
1eff0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1f000 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a   file is empty..
1f010 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
1f020 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
1f030 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c  ty and the *-wal
1f040 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70   file exists, op
1f050 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  en the pager.** 
1f060 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66  in WAL mode.  If
1f070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f080 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20   empty or if no 
1f090 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1f0a0 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65  s and.** if no e
1f0b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b  rror occurs, mak
1f0c0 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75  e sure Pager.jou
1f0d0 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20  rnalMode is not 
1f0e0 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  set to.** PAGER_
1f0f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e  JOURNALMODE_WAL.
1f100 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1f110 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72  LITE_OK or an er
1f120 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1f130 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1f140 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f  hold a SHARED lo
1f150 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1f160 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20  se file to call 
1f170 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1f180 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43  . Because an EXC
1f190 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1f1a0 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65  he db file is re
1f1b0 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65  quired to delete
1f1c0 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20   .** a WAL on a 
1f1d0 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62  none-empty datab
1f1e0 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  ase, this ensure
1f1f0 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61  s there is no ra
1f200 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a  ce condition .**
1f210 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63   between the xAc
1f220 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64  cess() below and
1f230 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65   an xDelete() be
1f240 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20  ing executed by 
1f250 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63  some .** other c
1f260 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
1f270 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
1f280 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50  enWalIfPresent(P
1f290 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f2a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f2b0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
1f2c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1f2d0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
1f2e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f2f0 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
1f300 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  K );..  if( !pPa
1f310 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
1f320 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20  .    int isWal; 
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f340 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41     /* True if WA
1f350 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  L file exists */
1f360 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  .    Pgno nPage;
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1f390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f3a0 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  */..    rc = pag
1f3b0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1f3c0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1f3d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f3e0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61   rc;.    if( nPa
1f3f0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ge==0 ){.      r
1f400 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1f410 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
1f420 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1f430 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  0);.      isWal 
1f440 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1f450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f460 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
1f470 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
1f480 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
1f490 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1f4a0 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
1f4b0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
1f4c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f4d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1f4e0 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
1f4f0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1f500 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
1f510 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
1f520 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
1f530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f540 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
1f550 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, 0);.      }el
1f560 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1f570 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1f580 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
1f590 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
1f5a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1f5b0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
1f5c0 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
1f5d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1f5e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1f5f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
1f600 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
1f610 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
1f620 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
1f630 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
1f640 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
1f650 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1f660 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
1f670 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
1f680 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
1f690 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
1f6a0 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
1f6b0 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
1f6c0 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
1f6d0 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
1f6e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
1f6f0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
1f700 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
1f710 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
1f720 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
1f730 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
1f740 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
1f750 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
1f760 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
1f770 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
1f780 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
1f790 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
1f7a0 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
1f7b0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
1f7c0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
1f7d0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
1f7e0 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
1f7f0 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1f800 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
1f810 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
1f820 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
1f830 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
1f840 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1f850 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
1f860 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
1f870 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1f880 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
1f890 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
1f8a0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1f8b0 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
1f8c0 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
1f8d0 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
1f8e0 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
1f8f0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1f900 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
1f910 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
1f920 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
1f930 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1f940 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1f950 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1f960 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
1f970 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
1f980 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1f990 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1f9a0 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
1f9b0 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
1f9c0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
1f9d0 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
1f9e0 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
1f9f0 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
1fa00 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
1fa10 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
1fa20 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
1fa30 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
1fa40 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
1fa50 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
1fa60 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
1fa70 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
1fa80 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
1fa90 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
1faa0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1fab0 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
1fac0 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
1fad0 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
1fae0 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
1faf0 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
1fb00 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
1fb10 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
1fb20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
1fb30 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
1fb40 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
1fb50 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
1fb60 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
1fb70 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
1fb80 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
1fb90 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
1fba0 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
1fbb0 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
1fbc0 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
1fbd0 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
1fbe0 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
1fbf0 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
1fc00 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
1fc10 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
1fc20 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1fc30 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
1fc40 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
1fc50 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
1fc60 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
1fc70 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
1fc80 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
1fc90 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
1fca0 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
1fcb0 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
1fcc0 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
1fcd0 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
1fce0 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
1fcf0 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
1fd00 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
1fd10 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
1fd20 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1fd30 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
1fd40 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
1fd50 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
1fd60 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
1fd70 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
1fd80 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
1fd90 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
1fda0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
1fdb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1fdc0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1fdd0 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
1fde0 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
1fdf0 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
1fe00 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
1fe10 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
1fe20 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1fe30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
1fe40 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
1fe50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fe60 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1fe70 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
1fe80 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1fe90 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
1fea0 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
1feb0 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
1fec0 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
1fed0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
1fee0 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
1fef0 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
1ff00 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
1ff10 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
1ff20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1ff30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1ff40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
1ff50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1ff60 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
1ff70 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
1ff80 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
1ff90 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
1ffa0 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
1ffb0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1ffc0 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
1ffd0 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
1ffe0 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
1fff0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
20000 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
20010 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
20020 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
20030 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
20040 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
20050 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
20060 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
20070 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
20080 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
20090 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
200a0 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
200b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
200c0 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
200d0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
200e0 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
200f0 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
20100 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
20110 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
20120 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
20130 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
20140 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
20150 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
20160 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20170 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
20180 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
20190 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
201a0 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
201b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
201c0 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
201d0 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
201e0 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
201f0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
20200 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
20210 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
20220 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20230 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20240 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
20250 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
20260 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
20270 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
20280 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20290 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
202a0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
202b0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
202c0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
202d0 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
202e0 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
202f0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
20300 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
20310 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
20320 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
20330 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
20340 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
20350 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20360 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
20370 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
20380 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
20390 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
203a0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
203b0 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
203c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
203d0 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
203e0 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
203f0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
20400 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
20410 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
20420 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
20430 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20440 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
20450 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
20460 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
20470 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
20480 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20490 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
204a0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
204b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
204c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
204d0 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
204e0 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
204f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20500 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
20510 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
20520 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
20530 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20540 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
20550 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
20560 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20570 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
20580 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
20590 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
205a0 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
205b0 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
205c0 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
205d0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
205e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
205f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20600 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
20610 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
20620 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20630 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
20640 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
20650 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
20660 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
20670 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
20680 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
20690 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
206a0 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
206b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
206c0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
206d0 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
206e0 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
206f0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
20700 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
20710 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
20720 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
20730 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
20740 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
20750 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
20760 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
20770 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
20780 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
20790 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
207a0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
207b0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
207c0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
207d0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
207e0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
207f0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
20800 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
20810 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
20820 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
20830 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
20840 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
20850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
20860 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
20870 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
20880 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
20890 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
208a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
208b0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
208c0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
208d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
208e0 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
208f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
20910 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
20920 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
20930 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
20940 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
20950 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
20960 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
20970 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
20980 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
20990 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
209a0 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
209b0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
209c0 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
209d0 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
209e0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
209f0 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
20a00 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
20a10 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
20a20 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
20a30 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
20a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
20a50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
20a60 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
20a70 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
20a80 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
20a90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
20aa0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
20ab0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20ac0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20ad0 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
20ae0 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
20af0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
20b00 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
20b10 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
20b20 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
20b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
20b40 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
20b50 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
20b60 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
20b70 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
20b80 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
20b90 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20ba0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
20bb0 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
20bc0 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
20bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20be0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
20bf0 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
20c00 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
20c10 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
20c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20c30 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
20c40 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
20c50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
20c60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
20c70 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
20c80 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
20c90 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
20ca0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
20cb0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
20cc0 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
20cd0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
20ce0 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
20cf0 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
20d00 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
20d10 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
20d20 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75  /*.** Free as mu
20d30 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
20d40 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70  sible from the p
20d50 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ager..*/.void sq
20d60 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b  lite3PagerShrink
20d70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20d80 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
20d90 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70  Shrink(pPager->p
20da0 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
20db0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
20dc0 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
20dd0 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
20de0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
20df0 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
20e00 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
20e10 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
20e20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
20e30 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
20e40 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20e50 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
20e60 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
20e70 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
20e80 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
20e90 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
20ea0 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
20eb0 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
20ec0 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
20ed0 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
20ee0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
20ef0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
20f00 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
20f10 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
20f20 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
20f30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20f40 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
20f50 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
20f60 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
20f70 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
20f80 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
20f90 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
20fa0 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
20fb0 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
20fc0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
20fd0 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
20fe0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
20ff0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
21000 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
21010 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
21020 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
21030 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
21040 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
21050 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
21060 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
21070 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
21080 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
21090 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
210a0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
210b0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
210c0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
210d0 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
210e0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
210f0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
21100 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
21110 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
21120 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
21130 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
21140 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
21150 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
21160 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
21170 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
21180 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
21190 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
211a0 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
211b0 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
211c0 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
211d0 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
211e0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
211f0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
21200 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
21210 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21220 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
21230 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
21240 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
21250 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
21260 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20  he above is for 
21270 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  a rollback-journ
21280 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41  al mode.  For WA
21290 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74  L mode, OFF cont
212a0 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e  inues.** to mean
212b0 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65   that no syncs e
212c0 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d  ver occur.  NORM
212d0 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  AL means that th
212e0 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a  e WAL is synced.
212f0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ** prior to the 
21300 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f  start of checkpo
21310 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  int and that the
21320 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
21330 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74  s synced.** at t
21340 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
21350 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
21360 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  if the entire co
21370 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c  ntent of the WAL
21380 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20  .** was written 
21390 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
213a0 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20  tabase.  But no 
213b0 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  sync operations 
213c0 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20  occur for.** an 
213d0 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20  ordinary commit 
213e0 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77  in NORMAL mode w
213f0 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d  ith WAL.  FULL m
21400 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
21410 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e  L.** file is syn
21420 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ced following ea
21430 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74  ch commit operat
21440 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e  ion, in addition
21450 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73   to the.** syncs
21460 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21470 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44   NORMAL..**.** D
21480 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79  o not confuse sy
21490 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77  nchronous=FULL w
214a0 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ith SQLITE_SYNC_
214b0 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  FULL.  The.** SQ
214c0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d  LITE_SYNC_FULL m
214d0 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73  acro means to us
214e0 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79  e the MacOSX-sty
214f0 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a  le full-fsync.**
21500 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46   using fcntl(F_F
21510 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49  ULLFSYNC).  SQLI
21520 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d  TE_SYNC_NORMAL m
21530 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a  eans to do an.**
21540 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28   ordinary fsync(
21550 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69  ) call.  There i
21560 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
21570 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53  between SQLITE_S
21580 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  YNC_FULL.** and 
21590 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
215a0 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  AL on platforms 
215b0 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53  other than MacOS
215c0 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73  X.  But the.** s
215d0 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
215e0 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f  versus synchrono
215f0 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e  us=NORMAL settin
21600 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  g determines whe
21610 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70  n.** the xSync p
21620 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c  rimitive is call
21630 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61  ed and is releva
21640 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f  nt to all platfo
21650 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  rms..**.** Numer
21660 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
21670 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
21680 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
21690 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
216a0 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
216b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
216c0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
216d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
216e0 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
216f0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
21700 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
21710 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61   pager to set sa
21720 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a  fety level for *
21730 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20  /.  int level,  
21740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41            /* PRA
21750 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e  GMA synchronous.
21760 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41    1=OFF, 2=NORMA
21770 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 20 20 0a 20  L, 3=FULL */  . 
21780 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 2c   int bFullFsync,
21790 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
217a0 20 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 20 20   fullfsync */.  
217b0 69 6e 74 20 62 43 6b 70 74 46 75 6c 6c 46 73 79  int bCkptFullFsy
217c0 6e 63 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20  nc    /* PRAGMA 
217d0 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66  checkpoint_fullf
217e0 73 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  sync */.){.  ass
217f0 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26  ert( level>=1 &&
21800 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70   level<=3 );.  p
21810 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
21820 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50   (level==1 || pP
21830 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
21840 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?1:0;.  pPager->
21850 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65  fullSync = (leve
21860 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
21870 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
21880 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
21890 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  oSync ){.    pPa
218a0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
218b0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
218c0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
218d0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62  0;.  }else if( b
218e0 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20  FullFsync ){.   
218f0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
21900 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
21910 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65  _FULL;.    pPage
21920 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21930 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
21940 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ULL;.  }else if(
21950 20 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20   bCkptFullFsync 
21960 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
21970 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
21980 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
21990 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
219a0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
219b0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
219c0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
219d0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
219e0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
219f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
21a00 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
21a10 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
21a20 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
21a30 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70  walSyncFlags = p
21a40 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
21a50 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
21a60 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
21a70 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
21a80 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43  lags |= WAL_SYNC
21a90 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
21aa0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
21ab0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
21ac0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
21ad0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
21ae0 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
21af0 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
21b00 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
21b10 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
21b20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
21b30 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
21b40 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
21b50 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
21b60 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
21b70 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
21b80 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
21b90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
21ba0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
21bb0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
21bc0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
21bd0 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
21be0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21bf0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
21c00 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
21c10 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
21c20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
21c30 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
21c40 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
21c50 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
21c60 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
21c70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
21c80 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
21c90 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
21ca0 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
21cb0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
21cc0 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
21cd0 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
21ce0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
21cf0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
21d00 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
21d10 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
21d20 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
21d30 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
21d40 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
21d50 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
21d60 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
21d70 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
21d80 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
21d90 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
21da0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
21db0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
21dc0 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
21dd0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
21de0 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
21df0 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
21e00 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
21e10 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
21e20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
21e30 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
21e40 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
21e50 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
21e60 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
21e70 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
21e80 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
21e90 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
21ea0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
21eb0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
21ec0 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
21ed0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
21ee0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
21ef0 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
21f00 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
21f10 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
21f20 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
21f30 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
21f40 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
21f50 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
21f60 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
21f70 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21f80 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
21f90 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
21fa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21fb0 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
21fc0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
21fd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
21fe0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
21ff0 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
22000 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
22010 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
22020 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
22030 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
22040 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
22050 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
22060 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
22070 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
22080 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
22090 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
220a0 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
220b0 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
220c0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
220d0 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
220e0 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
220f0 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
22100 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
22110 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
22120 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
22130 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
22140 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
22150 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
22160 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
22190 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
221a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
221b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
221c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
221d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
221e0 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
221f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
22200 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
22210 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
22220 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
22230 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
22240 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
22250 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
22260 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
22270 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
22280 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
22290 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
222a0 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
222b0 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
222c0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
222d0 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
222e0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
222f0 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
22300 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
22310 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
22320 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
22330 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
22340 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22350 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
22360 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
22370 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
22380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
22390 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
223a0 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
223b0 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
223c0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
223d0 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
223e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
223f0 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
22400 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
22410 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
22420 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
22430 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a  Handler */.){  .
22440 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
22450 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
22460 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
22470 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
22480 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
22490 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rg;.}../*.** Cha
224a0 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
224b0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
224c0 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
224d0 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
224e0 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
224f0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
22500 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
22510 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
22520 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
22530 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
22540 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
22550 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
22560 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
22570 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
22580 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
22590 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
225a0 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  RR, an SQLITE_IO
225b0 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65  ERR_xxx sub-code
225c0 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
225d0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
225e0 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
225f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
22600 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
22610 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
22620 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
22630 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
22640 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
22650 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
22660 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
22670 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
22680 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
22690 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
226a0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
226b0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
226c0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
226d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
226e0 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
226f0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
22700 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
22710 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
22720 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
22730 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
22740 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
22750 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
22760 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
22770 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
22780 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
22790 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
227a0 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
227b0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
227c0 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
227d0 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
227e0 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
227f0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
22800 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
22810 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
22820 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
22830 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
22840 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
22850 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
22860 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
22870 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
22880 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
22890 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
228a0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
228b0 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
228c0 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
228d0 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
228e0 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
228f0 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
22900 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
22910 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
22920 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
22930 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
22940 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
22950 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
22960 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
22970 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
22980 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
22990 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
229a0 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
229b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
229c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
229d0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
229e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
229f0 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20  u32 *pPageSize, 
22a00 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
22a10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22a20 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  _OK;..  /* It is
22a30 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
22a40 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72   do a full asser
22a50 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
22a60 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20  here, as this.  
22a70 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  ** function may 
22a80 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
22a90 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28  ithin PagerOpen(
22aa0 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74  ), before the st
22ab0 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ate.  ** of the 
22ac0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  Pager object is 
22ad0 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69  internally consi
22ae0 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stent..  **.  **
22af0 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
22b00 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
22b10 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  rned an error if
22b20 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
22b30 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52  n .  ** PAGER_ER
22b40 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73  ROR state. But s
22b50 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52  ince PAGER_ERROR
22b60 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65   state guarantee
22b70 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72  s that.  ** ther
22b80 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  e is at least on
22b90 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  e outstanding pa
22ba0 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68  ge reference, th
22bb0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
22bc0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
22bd0 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77  that case anyhow
22be0 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61  ..  */..  u32 pa
22bf0 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
22c00 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
22c10 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
22c20 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
22c30 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
22c40 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
22c50 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
22c60 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
22c70 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
22c80 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
22c90 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
22ca0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
22cb0 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65   .   && pageSize
22cc0 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75   && pageSize!=(u
22cd0 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
22ce0 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ize .  ){.    ch
22cf0 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b  ar *pNew = NULL;
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22d10 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a  New temp space *
22d20 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20  /.    i64 nByte 
22d30 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  = 0;..    if( pP
22d40 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
22d50 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65  ER_OPEN && isOpe
22d60 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
22d70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22d80 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
22d90 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65  ager->fd, &nByte
22da0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22db0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22dc0 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  {.      pNew = (
22dd0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
22de0 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
22df0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
22e00 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54  New ) rc = SQLIT
22e10 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a  E_NOMEM;.    }..
22e20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22e30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
22e40 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
22e50 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
22e60 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
22e70 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
22e80 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
22e90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
22ea0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
22eb0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
22ec0 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
22ed0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
22ee0 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
22ef0 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
22f00 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
22f10 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
22f20 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
22f30 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
22f40 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20  }..  *pPageSize 
22f50 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
22f60 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ze;.  if( rc==SQ
22f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
22f80 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20  f( nReserve<0 ) 
22f90 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65  nReserve = pPage
22fa0 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  r->nReserve;.   
22fb0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
22fc0 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
22fd0 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61  <1000 );.    pPa
22fe0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
22ff0 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (i16)nReserve;. 
23000 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
23010 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
23020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23030 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
23040 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
23050 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
23060 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
23070 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
23080 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
23090 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
230a0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
230b0 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
230c0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
230d0 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
230e0 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
230f0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
23100 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
23110 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
23120 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
23130 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
23140 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
23150 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
23160 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
23170 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
23180 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
23190 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
231a0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
231b0 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
231c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
231d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
231e0 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
231f0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
23200 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
23210 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
23220 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
23230 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
23240 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
23250 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
23260 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
23270 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
23280 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
23290 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
232a0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
232b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
232c0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
232d0 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
232e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
232f0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
23300 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
23310 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
23320 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
23330 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
23340 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
23350 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
23360 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
23370 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23380 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
23390 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20  OPEN );      /* 
233a0 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f  Called only by O
233b0 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20  P_MaxPgcnt */.  
233c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
233d0 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e  mxPgno>=pPager->
233e0 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50  dbSize );  /* OP
233f0 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63  _MaxPgcnt enforc
23400 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74  es this */.  ret
23410 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
23420 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
23430 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
23440 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
23450 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
23460 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
23470 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
23480 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
23490 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
234a0 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
234b0 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
234c0 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
234d0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
234e0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
234f0 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
23500 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
23510 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
23520 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
23530 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
23540 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
23550 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
23560 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
23570 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
23580 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
23590 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
235a0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
235b0 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
235c0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
235d0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
235e0 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
235f0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
23600 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
23610 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
23620 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
23630 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
23640 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
23650 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
23660 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
23670 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
23680 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
23690 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
236a0 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
236b0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
236c0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
236d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
236e0 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
236f0 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
23700 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
23710 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
23720 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
23730 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ts to. .**.** If
23740 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f   the pager was o
23750 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73  pened on a trans
23760 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65  ient file (zFile
23770 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a  name==""), or.**
23780 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c   opened on a fil
23790 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79  e less than N by
237a0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
237b0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
237c0 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20  s.** zeroed and 
237d0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
237e0 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ed. The rational
237f0 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  e for this is th
23800 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  at this .** func
23810 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
23820 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
23830 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77  aders, and a new
23840 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a   transient or.**
23850 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61   zero sized data
23860 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65  base has a heade
23870 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20  r than consists 
23880 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f  entirely of zero
23890 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  es..**.** If any
238a0 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20   IO error apart 
238b0 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52  from SQLITE_IOER
238c0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20  R_SHORT_READ is 
238d0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20  encountered,.** 
238e0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
238f0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
23900 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65  e caller and the
23910 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
23920 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65  .** output buffe
23930 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  r undefined..*/.
23940 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23950 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
23960 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
23970 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
23980 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
23990 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
239a0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
239b0 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
239c0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
239d0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
239e0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
239f0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
23a00 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
23a10 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74  y btree immediat
23a20 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69  ely after creati
23a30 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65  ng.  ** the Page
23a40 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65  r object.  There
23a50 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e   has not been an
23a60 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
23a70 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20  transition.  ** 
23a80 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e  to WAL mode yet.
23a90 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
23aa0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
23ab0 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69  ger) );..  if( i
23ac0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
23ad0 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
23ae0 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
23af0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
23b00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
23b10 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
23b20 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
23b30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
23b40 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
23b50 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
23b60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23b70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23b80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
23b90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
23ba0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
23bb0 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  when a read-tran
23bc0 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
23bd0 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e  on.** the pager.
23be0 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20   It returns the 
23bf0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
23c00 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
23c10 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77  abase..**.** How
23c20 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c  ever, if the fil
23c30 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61  e is between 1 a
23c40 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62  nd <page-size> b
23c50 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
23c60 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63  en .** this is c
23c70 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61  onsidered a 1 pa
23c80 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ge file..*/.void
23c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
23ca0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
23cb0 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
23cc0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
23cd0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
23ce0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
23cf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23d00 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
23d10 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b  ITER_FINISHED );
23d20 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e  .  *pnPage = (in
23d30 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  t)pPager->dbSize
23d40 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
23d50 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
23d60 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70   of type locktyp
23d70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
23d80 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20  e file. If.** a 
23d90 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74  similar or great
23da0 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  er lock is alrea
23db0 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  dy held, this fu
23dc0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
23dd0 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  p.** (returning 
23de0 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69  SQLITE_OK immedi
23df0 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ately)..**.** Ot
23e00 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74  herwise, attempt
23e10 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c   to obtain the l
23e20 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ock using sqlite
23e30 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b  3OsLock(). Invok
23e40 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63  e .** the busy c
23e50 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
23e60 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ock is currently
23e70 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
23e80 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c  Repeat .** until
23e90 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
23ea0 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ck returns false
23eb0 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74   or until the at
23ec0 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74  tempt to .** obt
23ed0 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  ain the lock suc
23ee0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
23ef0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
23f00 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
23f10 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
23f20 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
23f30 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74  * the lock. If t
23f40 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
23f50 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
23f60 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
23f70 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62  state .** variab
23f80 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62  le to locktype b
23f90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
23fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
23fb0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
23fc0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
23fd0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
23fe0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
24010 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43   code */..  /* C
24020 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
24030 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70  s either a no-op
24040 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65   (because the re
24050 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20  quested lock is 
24060 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65  .  ** already he
24070 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ld, or one of th
24080 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74  e transistions t
24090 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e  hat the busy-han
240a0 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dler.  ** may be
240b0 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c   invoked during,
240c0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
240d0 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a  e comment above.
240e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
240f0 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
24100 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
24110 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
24120 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20  >=locktype).    
24130 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
24140 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  Lock==NO_LOCK &&
24150 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
24160 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c  D_LOCK).       |
24170 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  | (pPager->eLock
24180 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
24190 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  && locktype==EXC
241a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
241b0 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  ;..  do {.    rc
241c0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
241d0 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
241e0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
241f0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
24200 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
24210 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
24220 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
24230 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24240 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61  /*.** Function a
24250 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24260 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20  straint(pPager) 
24270 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20  checks that one 
24280 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  of the .** follo
24290 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72  wing is true for
242a0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
242b0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
242c0 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a  e page-cache:.**
242d0 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67  .**   a) The pag
242e0 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
242f0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
24300 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
24310 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65  e .**      curre
24320 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  nt database imag
24330 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a  e, in pages, OR.
24340 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68  **.**   b) if th
24350 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77  e page content w
24360 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74  ere written at t
24370 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75  his time, it wou
24380 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62  ld not.**      b
24390 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  e necessary to w
243a0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
243b0 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20   content out to 
243c0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
243d0 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65  **      (as dete
243e0 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69  rmined by functi
243f0 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  on subjRequiresP
24400 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  age())..**.** If
24410 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61   the condition a
24420 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20  sserted by this 
24430 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f  function were no
24440 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a  t true, and the.
24450 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65  ** dirty page we
24460 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64  re to be discard
24470 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
24480 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53  e via the pagerS
24490 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69  tress().** routi
244a0 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28  ne, pagerStress(
244b0 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74  ) would not writ
244c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
244d0 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a  ge content to.**
244e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
244f0 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69  le. If a savepoi
24500 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
24510 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ere rolled back 
24520 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61  after.** this ha
24530 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72  ppened, the corr
24540 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f  ect behaviour wo
24550 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
24560 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
24570 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
24580 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
24590 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
245a0 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
245b0 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
245c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
245d0 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
245e0 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
245f0 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
24600 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
24610 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
24620 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
24630 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
24640 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
24650 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
24660 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
24670 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
24680 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
24690 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
246a0 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
246b0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
246c0 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
246d0 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
246e0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
246f0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
24700 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
24710 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
24720 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
24730 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
24740 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
24750 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
24760 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
24770 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
24780 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
24790 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
247a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
247b0 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
247c0 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
247d0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
247e0 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
247f0 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
24800 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
24810 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
24820 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
24830 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
24840 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
24850 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
24860 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
24870 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
24880 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
24890 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
248a0 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
248b0 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
248c0 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
248d0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
248e0 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
248f0 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
24900 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
24910 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
24920 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
24930 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
24940 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
24950 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
24960 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
24970 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
24980 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
24990 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
249a0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
249b0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
249c0 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
249d0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
249e0 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63 61  ;.  assertTrunca
249f0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
24a00 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ger);.}.../*.** 
24a10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
24a20 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61   called before a
24a30 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d  ttempting a hot-
24a40 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
24a50 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68  . It.** syncs th
24a60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
24a70 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74  o disk, then set
24a80 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  s pPager->journa
24a90 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73  lHdr to the.** s
24aa0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
24ab0 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  al file so that 
24ac0 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
24ad0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  ck() routine kno
24ae0 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65  ws.** that the e
24af0 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ntire journal fi
24b00 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
24b10 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e  ed..**.** Syncin
24b20 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
24b30 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61  to disk before a
24b40 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
24b50 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65  l it back ensure
24b60 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20  s .** that if a 
24b70 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63  power-failure oc
24b80 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
24b90 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72  rollback, the pr
24ba0 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74  ocess that.** at
24bb0 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20  tempts rollback 
24bc0 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d  following system
24bd0 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74   recovery sees t
24be0 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a  he same journal.
24bf0 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68  ** content as th
24c00 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  is process..**.*
24c10 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
24c20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c  goes as planned,
24c30 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
24c40 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
24c50 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65  e, .** an SQLite
24c60 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
24c70 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
24c80 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50  SyncHotJournal(P
24c90 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
24ca0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24cb0 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67  _OK;.  if( !pPag
24cc0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
24cd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
24ce0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
24cf0 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
24d00 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  RMAL);.  }.  if(
24d10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24d20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
24d30 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
24d40 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
24d50 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
24d60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
24d80 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
24d90 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
24da0 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
24db0 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
24dc0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
24dd0 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
24de0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
24df0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
24e00 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
24e10 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
24e20 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
24e30 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
24e40 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
24e50 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
24e60 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
24e70 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
24e80 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
24e90 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
24ea0 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
24eb0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
24ec0 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
24ed0 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
24ee0 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ump..**.** This 
24ef0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
24f00 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74  succeeds. If a t
24f10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
24f20 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a  tive an attempt.
24f30 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f  ** is made to ro
24f40 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61  ll it back. If a
24f50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
24f60 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
24f70 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75  ck .** a hot jou
24f80 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74  rnal may be left
24f90 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
24fa0 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  em but no error 
24fb0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74  is returned.** t
24fc0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
24fd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24fe0 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  rClose(Pager *pP
24ff0 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d  ager){.  u8 *pTm
25000 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72  p = (u8 *)pPager
25010 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20  ->pTmpSpace;..  
25020 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
25030 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
25040 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f  r) );.  disable_
25050 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
25060 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ors();.  sqlite3
25070 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
25080 63 28 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  c();.  /* pPager
25090 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a  ->errCode = 0; *
250a0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  /.  pPager->excl
250b0 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23  usiveMode = 0;.#
250c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
250d0 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33  IT_WAL.  sqlite3
250e0 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  WalClose(pPager-
250f0 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63  >pWal, pPager->c
25100 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50  kptSyncFlags, pP
25110 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
25120 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d  pTmp);.  pPager-
25130 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  >pWal = 0;.#endi
25140 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  f.  pager_reset(
25150 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d  pPager);.  if( M
25160 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65  EMDB ){.    page
25170 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
25180 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
25190 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c  * If it is open,
251a0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
251b0 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  l file before ca
251c0 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52  lling UnlockAndR
251d0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  ollback..    ** 
251e0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64  If this is not d
251f0 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73  one, then an uns
25200 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
25210 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
25220 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d  l .    ** file m
25230 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ay be played bac
25240 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
25250 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
25260 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a  failure occurs .
25270 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69      ** while thi
25280 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
25290 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
252a0 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
252b0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
252c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
252d0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
252e0 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75   to sync the jou
252f0 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20  rnal, shift the 
25300 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74  pager.    ** int
25310 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
25320 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55  e. This causes U
25330 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
25340 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20   to unlock the. 
25350 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
25360 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  nd close the jou
25370 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75  rnal file withou
25380 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  t attempting to 
25390 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62  roll it.    ** b
253a0 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20  ack or finalize 
253b0 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74  it. The next dat
253c0 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20  abase user will 
253d0 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a  have to do hot-j
253e0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f  ournal.    ** ro
253f0 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63  llback before ac
25400 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61  cessing the data
25410 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
25420 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  /.    if( isOpen
25430 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
25440 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
25450 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72  or(pPager, pager
25460 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
25470 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
25480 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
25490 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
254a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
254b0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
254c0 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
254d0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
254e0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
254f0 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
25500 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
25510 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
25520 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
25530 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
25540 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
25550 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  );.  sqlite3OsCl
25560 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
25570 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
25580 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69  ee(pTmp);.  sqli
25590 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70  te3PcacheClose(p
255a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
255b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
255c0 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
255d0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
255e0 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f  ee ) pPager->xCo
255f0 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e  decFree(pPager->
25600 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a  pCodec);.#endif.
25610 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
25620 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26  er->aSavepoint &
25630 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  & !pPager->pInJo
25640 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
25650 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
25660 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
25670 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
25680 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   );..  sqlite3_f
25690 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
256a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
256b0 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
256c0 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
256d0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
256e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
256f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
25700 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50  r page pPg..*/.P
25710 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
25720 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
25730 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
25740 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  n pPg->pgno;.}.#
25750 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
25760 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
25770 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
25780 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64  age pPg..*/.void
25790 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
257a0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
257b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
257c0 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f(pPg);.}../*.**
257d0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
257e0 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
257f0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
25800 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
25810 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
25820 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
25830 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
25840 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
25850 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
25860 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20  disk and can be 
25870 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  restored in the 
25880 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a  event of a hot-j
25890 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
258a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61  .**.** If the Pa
258b0 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20  ger.noSync flag 
258c0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  is set, then thi
258d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
258e0 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77  no-op..** Otherw
258f0 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73  ise, the actions
25900 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64   required depend
25910 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   on the journal-
25920 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a  mode and the .**
25930 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
25940 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 74  ristics of the t
25950 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
25960 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
25970 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
25980 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
25990 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
259a0 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
259b0 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
259c0 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
259d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
259e0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
259f0 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
25a00 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
25a10 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
25a20 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
25a30 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
25a40 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
25a50 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
25a60 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
25a70 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
25a80 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
25a90 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
25aa0 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
25ab0 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
25ac0 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
25ad0 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
25ae0 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
25af0 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
25b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
25b10 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
25b20 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
25b30 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
25b40 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
25b50 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
25b60 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
25b70 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
25b80 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
25b90 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
25ba0 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
25bb0 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
25bc0 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
25bd0 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
25be0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
25bf0 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
25c00 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
25c10 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
25c20 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
25c30 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
25c40 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
25c50 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
25c60 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
25c70 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
25c80 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
25c90 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63    }.**.** If suc
25ca0 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
25cb0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
25cc0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
25cd0 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
25ce0 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
25cf0 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
25d00 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
25d10 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
25d20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
25d30 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
25d40 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
25d50 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
25d60 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
25d70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
25d80 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
25d90 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65   *pPager, int ne
25da0 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  wHdr){.  int rc;
25db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
25dd0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
25de0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
25df0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
25e00 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
25e10 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
25e20 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
25e30 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
25e40 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
25e50 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
25e60 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25e70 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
25e80 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ger) );..  rc = 
25e90 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
25ea0 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
25eb0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
25ec0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
25ed0 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
25ee0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
25ef0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
25f00 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
25f10 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
25f20 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
25f30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
25f40 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
25f50 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
25f60 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
25f70 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
25f80 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
25f90 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
25fa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
25fb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25fc0 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
25fd0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
25fe0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
25ff0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
26000 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
26010 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
26020 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
26030 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
26040 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
26050 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
26060 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
26070 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
26080 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
26090 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
260a0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
260b0 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
260c0 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
260d0 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
260e0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
260f0 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
26100 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
26110 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
26120 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
26130 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
26140 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
26150 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
26160 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
26170 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
26180 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
26190 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
261a0 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
261b0 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
261c0 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
261d0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
261e0 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
261f0 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
26200 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
26210 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
26220 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
26230 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
26240 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
26250 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
26260 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
26270 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
26280 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
26290 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
262a0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
262b0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
262c0 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
262d0 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
262e0 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
262f0 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
26300 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
26310 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
26320 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
26330 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
26340 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
26350 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
26360 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
26370 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
26380 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
26390 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
263a0 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
263b0 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
263c0 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
263d0 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
263e0 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
263f0 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
26400 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
26410 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
26420 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
26430 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
26440 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
26450 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26460 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
26470 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
26480 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
26490 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
264a0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
264b0 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
264c0 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
264d0 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
264e0 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
264f0 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
26500 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
26510 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
26520 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
26530 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
26540 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
26550 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
26560 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
26570 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
26580 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
26590 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
265a0 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
265b0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
265c0 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
265d0 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
265e0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
265f0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
26600 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
26610 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
26620 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
26630 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
26640 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
26650 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
26660 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
26670 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
26680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26690 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
266a0 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
266b0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
266c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
266d0 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
266e0 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
266f0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
26700 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
26710 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
26720 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
26730 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26740 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
26750 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
26760 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
26770 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
26780 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26790 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
267a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
267b0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
267c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
267d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
267e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
267f0 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
26800 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26810 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
26820 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
26830 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
26840 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
26850 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
26860 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
26870 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
26880 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
26890 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
268a0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
268b0 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
268c0 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
268d0 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
268e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
268f0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
26900 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
26910 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
26920 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
26930 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
26940 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
26950 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
26960 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
26970 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
26980 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
26990 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
269a0 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
269b0 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
269c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
269d0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
269e0 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
269f0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
26a00 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
26a10 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
26a20 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
26a30 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
26a40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
26a50 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
26a60 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
26a70 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
26a80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
26a90 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
26aa0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
26ab0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
26ac0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
26ad0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
26ae0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
26af0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26b00 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
26b10 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
26b20 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
26b30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26b40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
26b50 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
26b60 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
26b70 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
26b80 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
26b90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
26ba0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
26bb0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
26bc0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
26bd0 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
26be0 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
26bf0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
26c00 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
26c10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26c20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
26c30 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
26c40 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
26c50 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
26c60 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
26c70 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
26c80 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
26c90 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
26ca0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
26cb0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
26cc0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
26cd0 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
26ce0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
26cf0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
26d00 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
26d10 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
26d20 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
26d30 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
26d40 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
26d50 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
26d60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
26d70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
26d80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
26d90 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
26da0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
26db0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
26dc0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
26dd0 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
26de0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
26df0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
26e00 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
26e10 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
26e20 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
26e30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
26e40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26e50 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
26e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
26e70 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
26e80 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
26e90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
26ea0 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
26eb0 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
26ec0 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
26ed0 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
26ee0 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
26ef0 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
26f00 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
26f10 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
26f20 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
26f30 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
26f40 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
26f50 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
26f60 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
26f70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
26f80 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
26f90 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
26fa0 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
26fb0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
26fc0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
26fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26fe0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
26ff0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
27000 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
27010 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
27020 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
27030 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
27040 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
27050 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
27060 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
27070 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
27080 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
27090 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
270a0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
270b0 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
270c0 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
270d0 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
270e0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
270f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
27100 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
27110 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
27120 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
27130 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
27140 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
27150 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
27160 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
27170 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
27180 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
27190 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
271a0 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
271b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
271c0 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
271d0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
271e0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
271f0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
27200 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
27210 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
27220 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
27230 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
27240 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
27250 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
27260 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
27270 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
27280 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
27290 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
272a0 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
272b0 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
272c0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
272d0 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
272e0 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
272f0 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
27300 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
27310 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
27320 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
27330 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
27340 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
27350 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
27360 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
27370 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
27380 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
27390 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
273a0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
273b0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
273c0 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
273d0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
273e0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
273f0 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
27400 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
27410 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
27420 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
27430 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
27440 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
27450 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
27460 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
27470 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
27480 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
27490 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
274a0 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
274b0 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
274c0 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
274d0 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
274e0 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
274f0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
27500 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
27510 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
27520 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
27530 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
27540 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
27550 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
27560 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
27570 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
27580 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
27590 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
275a0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
275b0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
275c0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
275d0 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
275e0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
275f0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
27600 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27620 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
27630 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
27640 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
27650 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
27660 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
27670 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
27680 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
27690 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
276a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
276b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
276c0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
276d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
276e0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
276f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
27700 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
27710 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
27720 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
27730 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
27740 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
27750 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
27760 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
27770 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
27780 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
27790 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
277a0 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
277b0 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
277c0 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
277d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
277e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
277f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27800 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
27810 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
27820 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
27830 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
27840 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
27850 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
27860 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66  );.  }..  /* Bef
27870 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72  ore the first wr
27880 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46  ite, give the VF
27890 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74  S a hint of what
278a0 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20   the final.  ** 
278b0 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62  file size will b
278c0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
278d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
278e0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
278f0 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72  ->fd) );.  if( r
27900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27910 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 70  pPager->dbSize>p
27920 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
27930 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
27940 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
27950 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
27960 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
27970 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
27980 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
27990 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
279a0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
279b0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
279c0 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20  T, &szFile);.   
279d0 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
279e0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
279f0 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  Size;.  }..  whi
27a00 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
27a10 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
27a20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c    Pgno pgno = pL
27a30 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20  ist->pgno;..    
27a40 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
27a50 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
27a60 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
27a70 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
27a80 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
27a90 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
27aa0 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
27ab0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
27ac0 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c  eImage() was cal
27ad0 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
27ae0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
27af0 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
27b00 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
27b10 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
27b20 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
27b30 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
27b40 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
27b50 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74   ** Also, do not
27b60 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70   write out any p
27b70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65  age that has the
27b80 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
27b90 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65  E flag.    ** se
27ba0 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65  t (set by sqlite
27bb0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
27bc0 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ))..    */.    i
27bd0 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
27be0 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
27bf0 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
27c00 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
27c10 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
27c20 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
27c30 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
27c40 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  ze;   /* Offset 
27c50 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20  to write */.    
27c60 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20    char *pData;  
27c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c90 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74   /* Data to writ
27ca0 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20  e */    ..      
27cb0 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e  assert( (pList->
27cc0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
27cd0 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
27ce0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
27cf0 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
27d00 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
27d10 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20  r(pList);..     
27d20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
27d30 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
27d40 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
27d50 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
27d60 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
27d70 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
27d80 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
27d90 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
27da0 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
27db0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
27dc0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
27dd0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
27de0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
27df0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
27e00 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
27e10 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
27e20 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
27e30 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
27e40 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
27e50 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
27e60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
27e70 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
27e80 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
27e90 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
27ea0 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
27eb0 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
27ec0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
27ed0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
27ee0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
27ef0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
27f00 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
27f10 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
27f20 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
27f30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
27f40 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
27f50 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
27f60 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
27f70 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
27f80 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
27f90 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70  pdate any backup
27fa0 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67   objects copying
27fb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
27fc0 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a   this pager. */.
27fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
27fe0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
27ff0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
28000 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61   (u8*)pList->pDa
28010 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45  ta);..      PAGE
28020 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25  RTRACE(("STORE %
28030 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
28040 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
28050 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
28060 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
28070 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
28080 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
28090 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
280a0 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
280b0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
280c0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
280d0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
280e0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  db_count);.     
280f0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
28100 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
28110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
28120 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
28130 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
28140 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
28150 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
28160 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
28170 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
28180 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
28190 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
281a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
281b0 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
281c0 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
281d0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
281e0 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
281f0 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
28200 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
28210 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
28220 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
28230 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
28240 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
28250 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
28260 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
28270 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
28280 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
28290 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
282a0 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
282b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
282c0 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
282d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
282e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
282f0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
28300 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
28310 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
28320 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
28330 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
28340 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
28350 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
28360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
28370 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
28380 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
28390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
283a0 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
283b0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
283c0 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
283d0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
283e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
283f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
28400 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
28410 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
28420 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
28430 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
28440 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
28450 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
28460 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
28470 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
28480 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
28490 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
284a0 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
284b0 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
284c0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
284d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
284e0 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
284f0 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
28500 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
28510 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
28520 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
28530 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
28540 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
28550 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
28560 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
28570 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
28580 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
28590 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
285a0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
285b0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
285c0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
285d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
285e0 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
285f0 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
28600 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
28610 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
28620 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
28630 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
28640 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
28650 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
28660 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
28670 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
28680 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
28690 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
286a0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
286b0 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
286c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
286d0 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
286e0 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
286f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
28700 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
28710 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
28720 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
28730 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
28740 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
28750 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
28760 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
28770 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
28780 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
28790 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
287a0 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
287b0 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
287c0 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20  rnal(pPg) .     
287d0 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
287e0 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
287f0 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
28800 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
28810 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
28820 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
28830 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
28840 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
28850 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
28860 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
28870 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
28880 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
28890 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
288a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
288b0 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
288c0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
288d0 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
288e0 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65  set = (i64)pPage
288f0 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
28900 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
28910 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
28920 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
28930 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
28940 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
28950 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
28960 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
28970 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
28980 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
28990 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
289a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
289b0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
289c0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
289d0 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
289e0 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
289f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
28a00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28a10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
28a20 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
28a30 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
28a40 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
28a50 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
28a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28a70 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
28a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
28a90 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
28aa0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
28ab0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
28ac0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
28ad0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
28ae0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
28af0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
28b00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28b10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
28b20 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
28b30 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
28b40 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
28b50 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
28b60 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
28b70 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
28b80 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
28b90 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
28ba0 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
28bb0 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
28bc0 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
28bd0 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
28be0 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
28bf0 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
28c00 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
28c10 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
28c20 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
28c30 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
28c40 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
28c50 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
28c60 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
28c70 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
28c80 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
28c90 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
28ca0 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
28cb0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
28cc0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
28cd0 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
28ce0 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
28cf0 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
28d00 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
28d10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28d20 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
28d30 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
28d40 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
28d50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
28d60 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
28d70 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
28d80 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
28d90 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
28da0 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
28db0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
28dc0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
28dd0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
28de0 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
28df0 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
28e00 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
28e10 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
28e20 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
28e30 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
28e40 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
28e50 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
28e60 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
28e70 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
28e80 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
28e90 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
28ea0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
28eb0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
28ec0 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
28ed0 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
28ee0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
28ef0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
28f00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28f10 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
28f20 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
28f30 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
28f40 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
28f50 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
28f60 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63  /* The doNotSync
28f70 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73 65  Spill flag is se
28f80 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
28f90 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
28fa0 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
28fb0 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
28fc0 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
28fd0 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
28fe0 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
28ff0 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
29000 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
29010 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
29020 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
29030 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
29040 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
29050 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
29060 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
29070 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69 74  ill flag inhibit
29080 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
29090 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ling regardless 
290a0 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20  of whether.  ** 
290b0 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
290c0 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
290d0 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 61   is set during a
290e0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a   rollback..  **.
290f0 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
29100 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64   also prohibited
29110 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
29120 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68  r state since th
29130 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65  at could.  ** le
29140 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
29150 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20  orruption.   In 
29160 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
29170 65 6d 65 6e 74 61 74 6f 6e 20 69 74 20 0a 20 20  ementaton it .  
29180 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  ** is impossible
29190 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63   for sqlite3Pcac
291a0 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20  heFetch() to be 
291b0 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61  called with crea
291c0 74 65 46 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20 77  teFlag==1.  ** w
291d0 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f  hile in the erro
291e0 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69  r state, hence i
291f0 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
29200 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
29210 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c   to.  ** be call
29220 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  ed in the error 
29230 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65  state.  Neverthe
29240 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65  less, we include
29250 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20   a NEVER().  ** 
29260 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72  test for the err
29270 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61  or state as a sa
29280 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  feguard against 
29290 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a  future changes..
292a0 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
292b0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
292c0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
292d0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
292e0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29  er->doNotSpill )
292f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29300 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
29310 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20  >doNotSyncSpill 
29320 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  && (pPg->flags &
29330 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
29340 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
29350 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29360 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  }..  pPg->pDirty
29370 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
29380 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
29390 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ){.    /* Write 
293a0 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
293b0 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20  or this page to 
293c0 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  the log. */.    
293d0 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
293e0 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20  Page(pPg) ){ .  
293f0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
29400 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20  nalPage(pPg); . 
29410 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
29420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29430 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
29440 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
29450 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pPg, 0, 0);.    
29460 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
29470 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
29480 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
29490 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
294a0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
294b0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20  HDR_NEED_SYNC . 
294c0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
294d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
294e0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
294f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
29500 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
29510 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  r, 1);.    }.  .
29520 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
29530 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69  ge number of thi
29540 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72  s page is larger
29550 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
29560 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  t size of.    **
29570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
29580 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64  age, it may need
29590 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74   to be written t
295a0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
295b0 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  l..    ** This i
295c0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
295d0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74  ll to pager_writ
295e0 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c  e_pagelist() bel
295f0 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ow will not.    
29600 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
29610 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
29620 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
29630 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
29640 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
29650 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  owing sequence o
29660 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a  f events:.    **
29670 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  .    **   BEGIN;
29680 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75  .    **     <jou
29690 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20  rnal page X>.   
296a0 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20   **     <modify 
296b0 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
296c0 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b     SAVEPOINT sp;
296d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  .    **       <s
296e0 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
296f0 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
29700 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67      **       pag
29710 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
29720 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  .    **     ROLL
29730 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20  BACK TO sp;.    
29740 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e  **.    ** If (X>
29750 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
29760 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
29770 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
29780 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
29790 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65     ** out to the
297a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
297b0 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70  but will be drop
297c0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ped from the cac
297d0 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a  he. Then,.    **
297e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
297f0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
29800 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69  statement, readi
29810 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72  ng page X will r
29820 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ead.    ** data 
29830 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
29840 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c  e file. This wil
29850 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  l be the copy of
29860 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20   page X as it.  
29870 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
29880 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
29890 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
298a0 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
298b0 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20  OINT sp".    ** 
298c0 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
298d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
298e0 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77  solution is to w
298f0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
29900 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58   data for page X
29910 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
29920 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
29930 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
29940 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
29950 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
29960 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
29970 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63  estored to its c
29980 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65  urrent value whe
29990 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
299a0 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a  TO sp" is .    *
299b0 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  * executed..    
299c0 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
299d0 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  (.        rc==SQ
299e0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
299f0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
29a00 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
29a10 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20  resPage(pPg).   
29a20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   ) ){.      rc =
29a30 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
29a40 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  pPg);.    }.  . 
29a50 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
29a60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
29a70 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
29a80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
29a90 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
29aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29ab0 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
29ac0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
29ad0 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
29ae0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
29af0 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67  te_pagelist(pPag
29b00 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a  er, pPg);.    }.
29b10 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
29b20 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
29b30 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
29b40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29b50 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
29b60 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
29b70 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29b80 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
29b90 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
29ba0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
29bb0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
29bc0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
29bd0 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a  er, rc); .}.../*
29be0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
29bf0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
29c00 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
29c10 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
29c20 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
29c30 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
29c40 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
29c50 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
29c60 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
29c70 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
29c80 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
29c90 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
29ca0 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
29cb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29cc0 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
29cd0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
29ce0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
29cf0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
29d00 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
29d10 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
29d20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
29d30 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
29d40 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
29d50 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
29d60 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
29d70 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
29d80 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
29d90 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
29da0 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
29db0 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
29dc0 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
29dd0 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
29de0 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
29df0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
29e00 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
29e10 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
29e20 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
29e30 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
29e40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
29e50 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
29e60 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
29e70 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
29e80 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
29e90 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
29ea0 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
29eb0 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
29ec0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
29ed0 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
29ee0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
29ef0 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
29f00 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
29f10 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
29f20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
29f30 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
29f40 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
29f50 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
29f60 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
29f70 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a  AGER_* flags..**
29f80 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
29f90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
29fa0 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
29fb0 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
29fc0 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
29fd0 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
29fe0 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
29ff0 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
2a000 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
2a010 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
2a020 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2a030 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
2a040 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
2a050 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
2a060 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2a070 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
2a080 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
2a090 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
2a0a0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
2a0b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2a0c0 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
2a0d0 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
2a0e0 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
2a0f0 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
2a100 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
2a110 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
2a120 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
2a130 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
2a140 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
2a150 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
2a160 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
2a170 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
2a180 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2a190 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
2a1a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2a1b0 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2a1c0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
2a1d0 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
2a1e0 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
2a1f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
2a200 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
2a210 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2a220 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2a230 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
2a240 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2a250 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
2a260 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a280 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
2a290 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
2a2a0 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2a2b0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2a2c0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2a2d0 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
2a2e0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
2a2f0 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
2a300 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
2a310 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
2a320 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
2a330 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
2a340 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
2a350 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
2a360 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
2a370 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
2a380 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
2a390 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
2a3a0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2a3b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
2a3c0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
2a3d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a3e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2a3f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
2a400 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
2a410 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
2a420 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
2a430 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2a440 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
2a450 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a460 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2a470 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2a480 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  file */.  int re
2a490 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
2a4a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2a4b0 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
2a4c0 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2a4d0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
2a4e0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2a4f0 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
2a500 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
2a510 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
2a520 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
2a530 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
2a540 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2a550 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
2a560 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2a570 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
2a580 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
2a590 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
2a5a0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
2a5b0 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
2a5c0 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
2a5d0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2a5e0 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
2a5f0 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2a600 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
2a610 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2a620 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
2a630 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
2a640 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2a650 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
2a660 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
2a670 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2a680 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20  zUri = 0;    /* 
2a690 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79  URI args to copy
2a6a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   */.  int nUri =
2a6b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
2a6c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2a6d0 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74  s of URI args at
2a6e0 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20   *zUri */..  /* 
2a6f0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2a700 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
2a710 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
2a720 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2a730 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
2a740 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
2a750 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
2a760 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
2a770 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a  rnal). This.  **
2a780 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2a790 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
2a7a0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
2a7b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2a7c0 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20  dle .  ** and a 
2a7d0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
2a7e0 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74  file-handle. Not
2a7f0 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61  e that a "regula
2a800 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65  r journal-handle
2a810 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20  ".  ** may be a 
2a820 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20  wrapper capable 
2a830 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66  of caching the f
2a840 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20  irst portion of 
2a850 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
2a860 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20   file in memory 
2a870 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2a880 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2a890 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20  timization (see 
2a8a0 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c  .  ** source fil
2a8b0 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20  e journal.c)..  
2a8c0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2a8d0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2a8e0 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
2a8f0 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
2a900 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2a910 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2a920 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2a930 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
2a940 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2a950 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2a960 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
2a970 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ());.  }..  /* S
2a980 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
2a990 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69  riable to NULL i
2a9a0 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
2a9b0 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70  occurs. */.  *pp
2a9c0 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e  Pager = 0;..#ifn
2a9d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a9e0 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66  MEMORYDB.  if( f
2a9f0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d  lags & PAGER_MEM
2aa00 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62  ORY ){.    memDb
2aa10 20 3d 20 31 3b 0a 20 20 20 20 7a 46 69 6c 65 6e   = 1;.    zFilen
2aa20 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  ame = 0;.  }.#en
2aa30 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  dif..  /* Comput
2aa40 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
2aa50 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e  full pathname in
2aa60 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75   an allocated bu
2aa70 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a  ffer pointed.  *
2aa80 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d  * to by zPathnam
2aa90 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e  e, length nPathn
2aaa0 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73  ame. Or, if this
2aab0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2aac0 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65  file,.  ** leave
2aad0 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20   both nPathname 
2aae0 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65  and zPathname se
2aaf0 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  t to 0..  */.  i
2ab00 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2ab10 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2ab20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2ab30 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  z;.    nPathname
2ab40 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
2ab50 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68  ame+1;.    zPath
2ab60 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
2ab70 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32  lloc(nPathname*2
2ab80 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
2ab90 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
2aba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2abb0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2abc0 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
2abd0 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  ; /* Make sure i
2abe0 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20  nitialized even 
2abf0 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  if FullPathname(
2ac00 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  ) fails */.    r
2ac10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
2ac20 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
2ac30 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
2ac40 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
2ac50 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2ac60 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2ac70 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
2ac80 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46    z = zUri = &zF
2ac90 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53  ilename[sqlite3S
2aca0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
2acb0 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65  e)+1];.    while
2acc0 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20  ( *z ){.      z 
2acd0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2ace0 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a  30(z)+1;.      z
2acf0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2ad00 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a  n30(z)+1;.    }.
2ad10 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29      nUri = (int)
2ad20 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a  (&z[1] - zUri);.
2ad30 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72 69      assert( nUri
2ad40 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  >=0 );.    if( r
2ad50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2ad60 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73  nPathname+8>pVfs
2ad70 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a  ->mxPathname ){.
2ad80 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
2ad90 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
2ada0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  en the journal p
2adb0 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a  ath required by.
2adc0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
2add0 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e  abase being open
2ade0 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20  ed will be more 
2adf0 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74  than pVfs->mxPat
2ae00 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62  hname.      ** b
2ae10 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
2ae20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64  This means the d
2ae30 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
2ae40 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20  e opened,.      
2ae50 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f  ** as it will no
2ae60 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
2ae70 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
2ae80 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20  l file or even. 
2ae90 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f       ** check fo
2aea0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
2aeb0 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a  before reading..
2aec0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2aed0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
2aee0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
2aef0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2af00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
2af10 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
2af20 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  hname);.      re
2af30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2af40 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
2af50 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
2af60 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2af70 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c  , PCache object,
2af80 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20   the.  ** three 
2af90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2afa0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
2afb0 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ile name and the
2afc0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
2afd0 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61  ile name. The la
2afe0 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69  yout in memory i
2aff0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  s as follows:.  
2b000 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65  **.  **     Page
2b010 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  r object        
2b020 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
2b030 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73  eof(Pager) bytes
2b040 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68  ).  **     PCach
2b050 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  e object        
2b060 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
2b070 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20  te3PcacheSize() 
2b080 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2b090 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  Database file ha
2b0a0 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  ndle            
2b0b0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
2b0c0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2b0d0 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  Sub-journal file
2b0e0 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
2b0f0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2b100 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2b110 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   Main journal fi
2b120 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2b130 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2b140 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2b150 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2b160 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
2b170 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62    (nPathname+1 b
2b180 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a  ytes).  **     J
2b190 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2b1b0 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79  nPathname+8+1 by
2b1c0 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72  tes).  */.  pPtr
2b1d0 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
2b1e0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
2b1f0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2b200 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f  Pager)) +      /
2b210 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
2b220 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  e */.    ROUND8(
2b230 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20  pcacheSize) +   
2b240 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68          /* PCach
2b250 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
2b260 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
2b270 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f  sFile) +       /
2b280 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69  * The main db fi
2b290 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  le */.    journa
2b2a0 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20  lFileSize * 2 + 
2b2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b2c0 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  two journal file
2b2d0 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e  s */ .    nPathn
2b2e0 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b  ame + 1 + nUri +
2b2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
2b300 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61  ename */.    nPa
2b310 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20  thname + 8 + 2  
2b320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2b330 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  Journal */.#ifnd
2b340 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2b350 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61  AL.    + nPathna
2b360 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20  me + 4 + 2      
2b370 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f        /* zWal */
2b380 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61  .#endif.  );.  a
2b390 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2b3a0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49  E_ALIGNMENT(SQLI
2b3b0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f  TE_INT_TO_PTR(jo
2b3c0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20  urnalFileSize)) 
2b3d0 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29  );.  if( !pPtr )
2b3e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
2b3f0 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
2b400 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b410 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50  _NOMEM;.  }.  pP
2b420 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20  ager =          
2b430 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74      (Pager*)(pPt
2b440 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50  r);.  pPager->pP
2b450 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63  Cache =    (PCac
2b460 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  he*)(pPtr += ROU
2b470 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2b480 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  er)));.  pPager-
2b490 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33  >fd =   (sqlite3
2b4a0 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2b4b0 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2b4c0 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  e));.  pPager->s
2b4d0 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
2b4e0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2b4f0 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2b500 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile));.  pPager-
2b510 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33  >jfd =  (sqlite3
2b520 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2b530 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2b540 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
2b550 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72  ename =    (char
2b560 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2b570 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61  alFileSize);.  a
2b580 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2b590 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67  E_ALIGNMENT(pPag
2b5a0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  er->jfd) );..  /
2b5b0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61  * Fill in the Pa
2b5c0 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e  ger.zFilename an
2b5d0 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
2b5e0 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71   buffers, if req
2b5f0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
2b600 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
2b610 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61   assert( nPathna
2b620 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67  me>0 );.    pPag
2b630 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
2b640 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2b650 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2b660 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2b670 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
2b680 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
2b690 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2b6a0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2b6b0 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2b6c0 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2b6d0 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2b6e0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2b6f0 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2b700 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2b710 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2b720 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2b730 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2b740 22 2c 20 38 2b 31 29 3b 0a 20 20 20 20 73 71 6c  ", 8+1);.    sql
2b750 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2b760 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2b770 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2b780 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2b790 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2b7a0 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2b7b0 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2b7c0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2b7d0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2b7e0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2b7f0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2b800 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2b810 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2b820 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2b830 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2b840 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2b850 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2b860 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2b870 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2b880 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
2b890 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  name);.  }.  pPa
2b8a0 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
2b8b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
2b8c0 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
2b8d0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
2b8e0 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
2b8f0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2b900 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2b910 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74   ){.    int fout
2b920 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b930 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
2b940 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  flags returned b
2b950 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20  y xOpen() */.   
2b960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
2b970 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
2b980 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2b990 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67  ger->fd, vfsFlag
2b9a0 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61  s, &fout);.    a
2b9b0 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b  ssert( !memDb );
2b9c0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2b9d0 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
2b9e0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
2b9f0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
2ba00 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
2ba10 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
2ba20 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
2ba30 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
2ba40 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2ba50 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
2ba60 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
2ba70 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2ba80 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
2ba90 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
2baa0 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
2bab0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
2bac0 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
2bad0 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
2bae0 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
2baf0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
2bb00 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
2bb10 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  e().    **    + 
2bb20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
2bb30 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
2bb40 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
2bb50 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ally..    */.   
2bb60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bb70 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20  OK && !readOnly 
2bb80 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74  ){.      setSect
2bb90 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2bba0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2bbb0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2bbc0 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
2bbd0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2bbe0 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IZE);.      if( 
2bbf0 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
2bc00 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
2bc10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2bc20 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
2bc30 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2bc40 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
2bc50 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2bc60 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
2bc70 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2bc80 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  IZE;.        }el
2bc90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  se{.          sz
2bca0 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29  PageDflt = (u32)
2bcb0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2bcc0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
2bcd0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2bce0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2bcf0 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a  C_WRITE.      {.
2bd00 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
2bd10 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
2bd20 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2bd30 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
2bd40 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
2bd50 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2bd60 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2bd70 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
2bd80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2bd90 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2bda0 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
2bdb0 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
2bdc0 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  rt(SQLITE_MAX_DE
2bdd0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2bde0 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20  =65536);.       
2bdf0 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
2be00 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
2be10 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2be20 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
2be30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
2be40 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
2be50 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
2be60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2be70 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
2be80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2be90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
2bea0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ndif.    }.  }el
2beb0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
2bec0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2bed0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
2bee0 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
2bef0 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
2bf00 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
2bf10 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
2bf20 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
2bf30 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
2bf40 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
2bf50 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
2bf60 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
2bf70 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
2bf80 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2bf90 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
2bfa0 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
2bfb0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
2bfc0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
2bfd0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
2bfe0 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
2bff0 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
2c000 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
2c010 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
2c020 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
2c030 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
2c040 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20  urnal..    */ . 
2c050 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
2c060 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
2c070 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
2c080 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ER;.    pPager->
2c090 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56  eLock = EXCLUSIV
2c0a0 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64  E_LOCK;.    read
2c0b0 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73  Only = (vfsFlags
2c0c0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2c0d0 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DONLY);.  }..  /
2c0e0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2c0f0 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74  call to PagerSet
2c100 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65  Pagesize() serve
2c110 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  s to set the val
2c120 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65  ue of .  ** Page
2c130 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74  r.pageSize and t
2c140 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
2c150 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
2c160 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  uffer..  */.  if
2c170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c180 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2c190 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
2c1a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2c1b0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
2c1c0 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50  ize(pPager, &szP
2c1d0 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20  ageDflt, -1);.  
2c1e0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
2c1f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
2c200 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
2c210 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65  or occurred in e
2c220 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
2c230 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20  cks above, free 
2c240 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20  the .  ** Pager 
2c250 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
2c260 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
2c270 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
2c280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2c290 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70  sert( !pPager->p
2c2a0 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20  TmpSpace );.    
2c2b0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2c2c0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2c2d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
2c2e0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
2c2f0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
2c300 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43  nitialize the PC
2c310 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  ache object. */.
2c320 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
2c330 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72  <1000 );.  nExtr
2c340 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
2c350 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  a);.  sqlite3Pca
2c360 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
2c370 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
2c380 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
2c390 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
2c3a0 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
2c3b0 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
2c3c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2c3d0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2c3e0 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
2c3f0 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
2c400 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
2c410 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  >zFilename));.  
2c420 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
2c430 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
2c440 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2c450 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e  me))..  pPager->
2c460 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
2c470 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f  )useJournal;.  /
2c480 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
2c490 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
2c4a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
2c4b0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2c4c0 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
2c4d0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2c4e0 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
2c4f0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2c500 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
2c510 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
2c520 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
2c530 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
2c540 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
2c550 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
2c560 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2c570 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20  _UNLOCK; */.#if 
2c580 30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  0.  assert( pPag
2c590 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
2c5a0 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
2c5b0 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
2c5c0 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64  _UNLOCK) );.#end
2c5d0 69 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  if.  /* pPager->
2c5e0 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
2c5f0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
2c600 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
2c610 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
2c620 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2c630 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
2c640 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
2c650 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2c660 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2c670 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
2c680 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2c690 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
2c6a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
2c6b0 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
2c6c0 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
2c6d0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2c6e0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
2c6f0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2c700 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
2c710 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
2c720 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
2c730 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65  readOnly;.  asse
2c740 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
2c750 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
2c760 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
2c770 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
2c780 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28  >tempFile;.  if(
2c790 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2c7a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2c7b0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d  Pager->fullSync=
2c7c0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2c7d0 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  ( pPager->syncFl
2c7e0 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2c7f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61  sert( pPager->wa
2c800 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  lSyncFlags==0 );
2c810 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2c820 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2c830 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  gs==0 );.  }else
2c840 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  {.    pPager->fu
2c850 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  llSync = 1;.    
2c860 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2c870 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2c880 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
2c890 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2c8a0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2c8b0 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43  ORMAL | WAL_SYNC
2c8c0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
2c8d0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
2c8e0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2c8f0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2c900 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2c910 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
2c920 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2c930 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
2c940 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
2c950 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
2c960 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28  ager->nExtra = (
2c970 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50  u16)nExtra;.  pP
2c980 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
2c990 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
2c9a0 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
2c9b0 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
2c9c0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2c9d0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70  ger->fd) || temp
2c9e0 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63  File );.  setSec
2c9f0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2ca00 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e  .  if( !useJourn
2ca10 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  al ){.    pPager
2ca20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2ca30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2ca40 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69  E_OFF;.  }else i
2ca50 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
2ca60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2ca70 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2ca80 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
2ca90 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
2caa0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
2cab0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2cac0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
2cad0 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  rg = 0; */.  pPa
2cae0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
2caf0 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d   xReinit;.  /* m
2cb00 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
2cb10 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
2cb20 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
2cb30 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  */..  *ppPager =
2cb40 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
2cb50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2cb60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2cb70 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2cb80 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
2cb90 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
2cba0 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
2cbb0 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
2cbc0 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
2cbd0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
2cbe0 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
2cbf0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2cc00 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
2cc10 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
2cc20 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
2cc30 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
2cc40 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
2cc50 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
2cc60 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
2cc70 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
2cc80 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
2cc90 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
2cca0 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
2ccb0 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2ccc0 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
2ccd0 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
2cce0 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
2ccf0 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2cd00 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2cd10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2cd20 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
2cd30 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
2cd40 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
2cd50 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2cd60 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
2cd70 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2cd80 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
2cd90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2cda0 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
2cdb0 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
2cdc0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
2cdd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2cde0 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
2cdf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2ce00 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
2ce10 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
2ce20 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
2ce30 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
2ce40 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
2ce50 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
2ce60 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2ce70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2ce80 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
2ce90 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
2cea0 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2ceb0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2cec0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2ced0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
2cee0 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
2cef0 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
2cf00 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
2cf10 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
2cf20 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2cf30 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2cf40 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
2cf50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2cf60 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
2cf70 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
2cf80 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
2cf90 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
2cfa0 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
2cfb0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
2cfc0 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
2cfd0 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
2cfe0 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
2cff0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
2d000 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
2d010 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2d020 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
2d030 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
2d040 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
2d050 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
2d060 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
2d070 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
2d080 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2d090 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
2d0a0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2d0b0 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
2d0c0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
2d0d0 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
2d0e0 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2d0f0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2d100 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2d110 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
2d120 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
2d130 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
2d140 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
2d150 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
2d160 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
2d170 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
2d180 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
2d190 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
2d1a0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
2d1b0 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
2d1c0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
2d1d0 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
2d1e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2d1f0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
2d200 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
2d210 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d220 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
2d230 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2d240 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20  int exists = 1; 
2d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d260 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
2d270 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2d280 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c  nt */.  int jrnl
2d290 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28  Open = !!isOpen(
2d2a0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20  pPager->jfd);.. 
2d2b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d2c0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2d2d0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2d2e0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
2d2f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d300 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
2d310 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  PEN );..  assert
2d320 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c  ( jrnlOpen==0 ||
2d330 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   ( sqlite3OsDevi
2d340 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2d350 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  s(pPager->jfd) &
2d360 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41  .    SQLITE_IOCA
2d370 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
2d380 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20  EN_OPEN.  ));.. 
2d390 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
2d3a0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2d3b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2d3c0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
2d3d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2d3e0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
2d3f0 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
2d400 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
2d410 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
2d420 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  ists ){.    int 
2d430 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20  locked = 0;     
2d440 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d450 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20  if some process 
2d460 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2d470 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a   lock */..    /*
2d480 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   Race condition 
2d490 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70  here:  Another p
2d4a0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76  rocess might hav
2d4b0 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74  e been holding t
2d4c0 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45  he.    ** the RE
2d4d0 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SERVED lock and 
2d4e0 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  have a journal o
2d4f0 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74  pen at the sqlit
2d500 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20  e3OsAccess() .  
2d510 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c    ** call above,
2d520 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65   but then delete
2d530 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
2d540 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62   drop the lock b
2d550 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20  efore.    ** we 
2d560 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  get to the follo
2d570 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68  wing sqlite3OsCh
2d580 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2d590 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74  ) call.  If that
2d5a0 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
2d5b0 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
2d5c0 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68  e might think th
2d5d0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
2d5e0 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  rnal when.    **
2d5f0 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69   in fact there i
2d600 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65  s none.  This re
2d610 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65  sults in a false
2d620 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20  -positive which 
2d630 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64  will.    ** be d
2d640 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65  ealt with by the
2d650 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e   playback routin
2d660 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33  e.  Ticket #3883
2d670 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2d680 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  = sqlite3OsCheck
2d690 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
2d6a0 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64  ger->fd, &locked
2d6b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2d6c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63  QLITE_OK && !loc
2d6d0 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ked ){.      Pgn
2d6e0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
2d6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d700 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
2d710 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2d720 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
2d730 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
2d740 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
2d750 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  f it consists of
2d760 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20   0 pages,.      
2d770 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ** then delete t
2d780 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2d790 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20   See the header 
2d7a0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f  comment above fo
2d7b0 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  r .      ** the 
2d7c0 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20  reasoning here. 
2d7d0 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f   Delete the obso
2d7e0 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
2d7f0 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a  e under.      **
2d800 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2d810 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63   to avoid race c
2d820 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f  onditions and to
2d830 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67   avoid violating
2d840 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32  .      ** [H3302
2d850 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  0]..      */.   
2d860 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2d870 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2d880 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
2d890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d8a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
2d8b0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2d8c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
2d8d0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
2d8e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d8f0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
2d900 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
2d910 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
2d920 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2d930 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
2d940 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2d950 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
2d960 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
2d970 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
2d980 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
2d990 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
2d9a0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
2d9b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2d9c0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
2d9d0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
2d9e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2d9f0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
2da00 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
2da10 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2da20 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
2da30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
2da40 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
2da50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2da60 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
2da70 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
2da80 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
2da90 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
2daa0 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
2dab0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2dac0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
2dad0 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
2dae0 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
2daf0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
2db00 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
2db10 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
2db20 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
2db30 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
2db40 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
2db50 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
2db60 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
2db70 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2db80 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
2db90 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
2dba0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2dbb0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
2dbc0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2dbd0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
2dbe0 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
2dbf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2dc00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2dc10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dc20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
2dc30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2dc40 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
2dc50 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
2dc60 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
2dc70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2dc80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
2dc90 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
2dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
2dcb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2dcc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dcd0 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
2dce0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
2dcf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
2dd00 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
2dd10 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
2dd20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  }.            *p
2dd30 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
2dd40 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
2dd50 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2dd60 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
2dd70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2dd80 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
2dd90 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
2dda0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
2ddb0 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
2ddc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73            ** its
2ddd0 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64   has a zero head
2dde0 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62  er, that might b
2ddf0 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20  e due to an I/O 
2de00 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20  error, or.      
2de10 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
2de20 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20  t be due to the 
2de30 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64  race condition d
2de40 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61  escribed above a
2de50 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nd in.          
2de60 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38    ** ticket #388
2de70 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  3.  Either way, 
2de80 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
2de90 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a  journal is hot..
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54              ** T
2deb0 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66  his might be a f
2dec0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20  alse positive.  
2ded0 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68  But if it is, th
2dee0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  en the.         
2def0 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
2df00 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
2df10 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65   and recovery me
2df20 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61  chanism will dea
2df30 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
2df40 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61   with it under a
2df50 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2df60 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
2df70 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
2df80 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f       ** worry so
2df90 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20   much with race 
2dfa0 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
2dfb0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2dfc0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2dfd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2dfe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2dff0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e010 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2e020 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e030 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2e040 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
2e050 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
2e060 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2e070 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69  file..** It is i
2e080 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73  llegal to call s
2e090 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
2e0a0 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72  re() until after
2e0b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
2e0c0 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65  * has been succe
2e0d0 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20  ssfully called. 
2e0e0 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  If a shared-lock
2e0f0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
2e100 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   when.** this fu
2e110 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2e120 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
2e130 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
2e140 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  wing operations 
2e150 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d  are also perform
2e160 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2e170 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ion..**.**   1) 
2e180 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2e190 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47  currently in PAG
2e1a0 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e  ER_OPEN state (n
2e1b0 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20  o lock held.**  
2e1c0 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
2e1d0 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20  ase file), then 
2e1e0 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
2e1f0 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a  de to obtain a.*
2e200 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f  *      SHARED lo
2e210 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2e220 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61  se file. Immedia
2e230 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
2e240 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ning.**      the
2e250 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
2e260 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73  e file-system is
2e270 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68   checked for a h
2e280 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20  ot-journal,.**  
2e290 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61      which is pla
2e2a0 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73  yed back if pres
2e2b0 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61  ent. Following a
2e2c0 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a  ny hot-journal .
2e2d0 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
2e2e0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
2e2f0 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20  f the cache are 
2e300 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65  validated by che
2e310 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  cking.**      th
2e320 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  e 'change-counte
2e330 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  r' field of the 
2e340 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
2e350 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ader and.**     
2e360 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68   discarded if th
2e370 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20  ey are found to 
2e380 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  be invalid..**.*
2e390 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61  *   2) If the pa
2e3a0 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
2e3b0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
2e3c0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
2e3d0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
2e3e0 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67    no outstanding
2e3f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
2e400 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73  ny pages, and is
2e410 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2e420 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65  ate,.**      the
2e430 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
2e440 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68  made to clear th
2e450 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79  e error state by
2e460 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20   discarding.**  
2e470 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73      the contents
2e480 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63   of the page cac
2e490 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62  he and rolling b
2e4a0 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75  ack any open jou
2e4b0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c  rnal.**      fil
2e4c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
2e4d0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
2e4e0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
2e4f0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
2e500 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
2e510 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63  occurs while loc
2e520 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  king the databas
2e530 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  e, checking for 
2e540 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2e550 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e  le or .** rollin
2e560 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
2e570 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72   file, the IO er
2e580 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2e590 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
2e5a0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
2e5b0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
2e5c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2e5d0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2e5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e5f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
2e600 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2e610 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
2e620 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c  m b-tree and onl
2e630 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  y when there are
2e640 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e   no.  ** outstan
2e650 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73  ding pages. This
2e660 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
2e670 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68  e pager state sh
2e680 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a  ould either.  **
2e690 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44   be OPEN or READ
2e6a0 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e  ER. READER is on
2e6b0 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74  ly possible if t
2e6c0 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77  he pager is or w
2e6d0 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c  as in .  ** excl
2e6e0 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
2e6f0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
2e700 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
2e710 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
2e720 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
2e730 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
2e740 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
2e750 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
2e760 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2e770 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
2e780 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2e790 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
2e7a0 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42   if( NEVER(MEMDB
2e7b0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
2e7c0 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70  ode) ){ return p
2e7d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20  Pager->errCode; 
2e7e0 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  }..  if( !pagerU
2e7f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
2e800 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2e810 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
2e820 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e     int bHotJourn
2e830 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  al = 1;         
2e840 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
2e850 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a  e exists a hot j
2e860 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a  ournal-file */..
2e870 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
2e880 44 42 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  DB );..    rc = 
2e890 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
2e8a0 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
2e8b0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2e8c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e8d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2e8e0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
2e8f0 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  O_LOCK || pPager
2e900 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
2e910 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67  _LOCK );.      g
2e920 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
2e930 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  }..    /* If a j
2e940 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2e950 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
2e960 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
2e970 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
2e980 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
2e990 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
2e9a0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
2e9b0 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
2e9c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2e9d0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d   pPager->eLock<=
2e9e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
2e9f0 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
2ea00 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2ea10 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20  &bHotJournal);. 
2ea20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
2ea30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ea40 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2ea50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
2ea60 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
2ea70 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
2ea80 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
2ea90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2eaa0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
2eab0 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
2eac0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
2ead0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
2eae0 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
2eaf0 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
2eb00 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
2eb10 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
2eb20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
2eb30 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
2eb40 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
2eb50 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
2eb60 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
2eb70 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
2eb80 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
2eb90 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2eba0 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
2ebb0 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
2ebc0 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
2ebd0 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
2ebe0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
2ebf0 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
2ec00 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
2ec10 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
2ec20 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
2ec30 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
2ec40 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
2ec50 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
2ec60 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
2ec70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ec80 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
2ec90 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
2eca0 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
2ecb0 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
2ecc0 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
2ecd0 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
2ece0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
2ecf0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  e file..      **
2ed00 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73  .      ** Unless
2ed10 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
2ed20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
2ed30 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
2ed40 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20  e lock is.      
2ed50 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
2ed60 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66   SHARED_LOCK bef
2ed70 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
2ed80 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20  n returns..     
2ed90 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
2eda0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
2edb0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
2edc0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
2edd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ede0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
2edf0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  ed;.      }. .  
2ee00 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
2ee10 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
2ee20 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78   and the file ex
2ee30 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70  ists on disk, op
2ee40 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
2ee50 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
2ee60 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
2ee70 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20  Write access is 
2ee80 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
2ee90 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78   .      ** in ex
2eea0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
2eeb0 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
2eec0 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
2eed0 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20  kept open .     
2eee0 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79   ** and possibly
2eef0 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
2ef00 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
2ef10 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63  . Also, write-ac
2ef20 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  cess .      ** i
2ef30 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72  s usually requir
2ef40 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ed to finalize t
2ef50 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f  he journal in jo
2ef60 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69  urnal_mode=persi
2ef70 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  st .      ** mod
2ef80 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20  e (and also for 
2ef90 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75  journal_mode=tru
2efa0 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79  ncate on some sy
2efb0 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a  stems)..      **
2efc0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
2efd0 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
2efe0 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61  t exist, it usua
2eff0 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73  lly means that s
2f000 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74  ome .      ** ot
2f010 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
2f020 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
2f030 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
2f040 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
2f050 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ** this connecti
2f060 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  on obtained the 
2f070 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61  exclusive lock a
2f080 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20  bove. Or, it .  
2f090 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
2f0a0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
2f0b0 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
2f0c0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
2f0d0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
2f0e0 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64  n was called and
2f0f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f100 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
2f110 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2f120 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
2f130 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2f140 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
2f150 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
2f160 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
2f170 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74        int bExist
2f180 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2f190 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
2f1a0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  al file exists *
2f1b0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
2f1c0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
2f1d0 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
2f1e0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2f1f0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
2f200 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73  S_EXISTS, &bExis
2f210 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ts);.        if(
2f220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f230 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20  & bExists ){.   
2f240 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
2f250 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2f260 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2f270 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
2f280 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2f290 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
2f2a0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2f2b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
2f2c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f2d0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2f2e0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2f2f0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
2f300 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
2f310 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
2f320 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
2f330 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2f340 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
2f350 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f360 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
2f370 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
2f380 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2f390 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2f3a0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
2f3b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2f3c0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
2f3d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f3e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f3f0 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
2f400 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
2f410 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
2f420 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
2f430 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
2f440 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
2f450 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
2f460 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
2f470 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
2f480 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
2f490 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
2f4a0 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
2f4b0 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
2f4c0 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
2f4d0 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74  t cache.  Sync t
2f4e0 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62  he hot journal b
2f4f0 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20  efore playing.  
2f500 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73      ** it back s
2f510 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73  ince the process
2f520 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e   that crashed an
2f530 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a  d left the hot j
2f540 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
2f550 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74  probably did not
2f560 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20   sync it and we 
2f570 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
2f580 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20  always sync.    
2f590 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
2f5a0 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20   before playing 
2f5b0 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  it back..      *
2f5c0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
2f5d0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2f5e0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2f5f0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2f600 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
2f610 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
2f620 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
2f630 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f650 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2f660 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
2f670 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   1);.          p
2f680 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2f690 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
2f6a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2f6b0 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
2f6c0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
2f6d0 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c          pagerUnl
2f6e0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
2f6f0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2f700 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
2f710 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f720 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2f730 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2f740 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2f750 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2f760 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  to open.        
2f770 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20  ** or roll back 
2f780 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68  a hot-journal wh
2f790 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ile holding an E
2f7a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
2f7b0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
2f7c0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75  ger_unlock() rou
2f7d0 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
2f7e0 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  led before retur
2f7f0 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20  ning to unlock. 
2f800 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69         ** the fi
2f810 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63  le. If the unloc
2f820 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c  k attempt fails,
2f830 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63   then Pager.eLoc
2f840 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20  k must be.      
2f850 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e    ** set to UNKN
2f860 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68  OWN_LOCK (see th
2f870 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
2f880 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20  the #define for 
2f890 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e  .        ** UNKN
2f8a0 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66  OWN_LOCK above f
2f8b0 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
2f8c0 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  n). .        **.
2f8d0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72          ** In or
2f8e0 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72  der to get pager
2f8f0 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20  _unlock() to do 
2f900 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e  this, set Pager.
2f910 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20  eState to.      
2f920 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
2f930 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f   now. This is no
2f940 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74  t actually count
2f950 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69  ed as a transiti
2f960 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  on.        ** to
2f970 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20   ERROR state in 
2f980 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61  the state diagra
2f990 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  m at the top of 
2f9a0 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20  this file,.     
2f9b0 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
2f9c0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d  now that the sam
2f9d0 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
2f9e0 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65  unlock() will ve
2f9f0 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68  ry.        ** sh
2fa00 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e  ortly transition
2fa10 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2fa20 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74  t to the OPEN st
2fa30 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20  ate. Calling.   
2fa40 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70       ** assert_p
2fa50 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75  ager_state() wou
2fa60 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20  ld fail now, as 
2fa70 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
2fa80 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
2fa90 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52    ** to be in ER
2faa0 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
2fab0 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75  here are zero ou
2fac0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a  tstanding page .
2fad0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72          ** refer
2fae0 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ences..        *
2faf0 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  /.        pager_
2fb00 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2fb10 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
2fb20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
2fb30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2fb40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2fb50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
2fb60 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
2fb70 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  er->eLock==SHARE
2fb80 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20  D_LOCK).        
2fb90 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
2fba0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
2fbb0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48  pPager->eLock>SH
2fbc0 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
2fbd0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
2fbe0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
2fbf0 46 69 6c 65 20 0a 20 20 20 20 20 26 26 20 28 70  File .     && (p
2fc00 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c  Pager->pBackup |
2fc10 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  | sqlite3PcacheP
2fc20 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
2fc30 3e 70 50 43 61 63 68 65 29 3e 30 29 20 0a 20 20  >pPCache)>0) .  
2fc40 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
2fc50 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
2fc60 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
2fc70 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
2fc80 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
2fc90 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
2fca0 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
2fcb0 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
2fcc0 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
2fcd0 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
2fce0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
2fcf0 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
2fd00 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
2fd10 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
2fd20 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
2fd30 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
2fd40 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
2fd50 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
2fd60 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  he..      **.   
2fd70 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
2fd80 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
2fd90 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
2fda0 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
2fdb0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ing.      ** at 
2fdc0 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
2fdd0 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
2fde0 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
2fdf0 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
2fe00 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
2fe10 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
2fe20 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
2fe30 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
2fe40 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
2fe50 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
2fe60 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
2fe70 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
2fe80 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65  .      ** a code
2fe90 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
2fea0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
2feb0 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
2fec0 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
2fed0 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
2fee0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
2fef0 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
2ff00 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
2ff10 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
2ff20 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
2ff30 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  l that.      ** 
2ff40 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
2ff50 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
2ff60 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d      Pgno nPage =
2ff70 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64   0;.      char d
2ff80 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
2ff90 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
2ffa0 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63  ers)];..      rc
2ffb0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
2ffc0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
2ffd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2ffe0 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a  ) goto failed;..
2fff0 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e        if( nPage>
30000 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54  0 ){.        IOT
30010 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
30020 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
30030 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
30040 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  s)));.        rc
30050 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
30060 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
30070 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
30080 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
30090 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
300a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
300b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
300c0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
300d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
300e0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46        memset(dbF
300f0 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65  ileVers, 0, size
30100 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
30110 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
30120 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
30130 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
30140 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
30150 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
30160 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  0 ){.        pag
30170 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
30180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30190 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
301a0 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
301b0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
301c0 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
301d0 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
301e0 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
301f0 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
30200 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
30210 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
30220 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
30230 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
30240 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e  nt(pPager);.#ifn
30250 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30260 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20  WAL.    assert( 
30270 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20  pPager->pWal==0 
30280 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
30290 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a   );.#endif.  }..
302a0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
302b0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
302c0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
302d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
302e0 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61   = pagerBeginRea
302f0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
30300 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
30310 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
30320 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72  =PAGER_OPEN && r
30330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30340 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
30350 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
30360 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  &pPager->dbSize)
30370 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
30380 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30390 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
303a0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
303b0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
303c0 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
303d0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
303e0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
303f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
30400 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
30410 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d  AGER_READER;.  }
30420 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30430 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
30440 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
30450 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
30460 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
30470 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
30480 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
30490 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
304a0 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
304b0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
304c0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
304d0 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
304e0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
304f0 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
30500 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
30510 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
30520 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
30530 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
30540 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
30550 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
30560 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
30570 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
30580 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71  ager){.  if( (sq
30590 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
305a0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
305b0 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  che)==0) ){.    
305c0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
305d0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
305e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71    }.}../*.** Acq
305f0 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
30600 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
30610 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50  pgno in pager pP
30620 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20  ager (a page.** 
30630 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79  reference has ty
30640 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20  pe DbPage*). If 
30650 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
30660 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73  ference is .** s
30670 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
30680 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69  ined, it is copi
30690 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e  ed to *ppPage an
306a0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
306b0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
306c0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
306d0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
306e0 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73  the cache, it is
306f0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
30700 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20  therwise, a new 
30710 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61  page object is a
30720 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
30730 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ulated with data
30740 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68  .** read from th
30750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
30760 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
30770 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
30780 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20  e may.** choose 
30790 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  not to allocate 
307a0 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
307b0 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20  t and may reuse 
307c0 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f  an existing.** o
307d0 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75  bject with no ou
307e0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
307f0 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nces..**.** The 
30800 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
30810 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
30820 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
30830 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  zed to zeros the
30840 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20   .** first time 
30850 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
30860 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66   into memory. If
30870 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73   the page reques
30880 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61  ted is .** alrea
30890 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  dy in the cache 
308a0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
308b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
308c0 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20  en the extra.** 
308d0 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20  data is left as 
308e0 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  it was when the 
308f0 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20  page object was 
30900 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  last used..**.**
30910 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
30920 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65   image is smalle
30930 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
30940 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20  sted page or if 
30950 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76  a .** non-zero v
30960 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61  alue is passed a
30970 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  s the noContent 
30980 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68  parameter and th
30990 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
309a0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
309b0 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ady stored in th
309c0 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f  e cache, then no
309d0 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b   .** actual disk
309e0 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e   read occurs. In
309f0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d   this case the m
30a00 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
30a10 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69  he .** page is i
30a20 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
30a30 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20  l zeros. .**.** 
30a40 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
30a50 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
30a60 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
30a70 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  re about the con
30a80 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
30a90 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
30aa0 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74  s in two seperat
30ab0 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  e scenarios:.**.
30ac0 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61  **   a) When rea
30ad0 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74  ding a free-list
30ae0 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20   leaf page from 
30af0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e  the database, an
30b00 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65  d.**.**   b) Whe
30b10 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73  n a savepoint is
30b20 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
30b30 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  ck and we need t
30b40 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61  o load.**      a
30b50 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74   new page into t
30b60 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66  he cache to be f
30b70 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
30b80 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  ata read.**     
30b90 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f   from the savepo
30ba0 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  int journal..**.
30bb0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
30bc0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
30bd0 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
30be0 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
30bf0 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65  d of.** being re
30c00 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
30c10 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
30c20 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
30c30 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
30c40 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
30c50 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
30c60 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
30c70 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
30c80 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
30c90 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
30ca0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
30cb0 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
30cc0 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
30cd0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
30ce0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
30cf0 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
30d00 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
30d10 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
30d20 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
30d30 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
30d40 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
30d50 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
30d60 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
30d70 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
30d80 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
30d90 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
30da0 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
30db0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
30dc0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
30dd0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
30de0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
30df0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
30e00 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
30e10 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
30e20 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
30e30 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
30e40 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
30e50 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
30e60 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
30e70 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
30e80 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
30e90 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
30ea0 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
30eb0 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
30ec0 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
30ed0 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
30ee0 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
30ef0 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
30f00 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
30f10 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
30f20 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
30f30 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
30f40 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
30f50 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
30f60 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
30f70 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
30f80 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
30f90 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
30fa0 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
30fb0 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
30fc0 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
30fd0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
30fe0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
30ff0 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
31000 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
31010 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
31020 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31030 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
31040 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
31050 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
31060 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
31070 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
31080 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
31090 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
310a0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
310b0 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
310c0 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
310d0 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
310e0 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
310f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
31100 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
31110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31120 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
31130 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
31140 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
31150 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
31160 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
31170 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
31180 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
31190 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
311a0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
311b0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
311c0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
311d0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20  immediately. .  
311e0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
311f0 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66  quest the page f
31200 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c  rom the PCache l
31210 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ayer. */.  if( p
31220 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
31230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31240 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
31250 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rCode;.  }else{.
31260 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31270 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
31280 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
31290 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20  o, 1, ppPage);. 
312a0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
312b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
312c0 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c  * Either the cal
312d0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
312e0 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e  heFetch() return
312f0 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74  ed an error or t
31300 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
31310 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  was already in t
31320 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
31330 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
31340 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  n was called..  
31350 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20    ** Set pPg to 
31360 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68  0 and jump to th
31370 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64  e exception hand
31380 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67  ler.  */.    pPg
31390 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70   = 0;.    goto p
313a0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
313b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
313c0 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
313d0 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
313e0 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  t( (*ppPage)->pP
313f0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
31400 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
31410 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  r==0 );..  if( (
31420 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
31430 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29   && !noContent )
31440 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
31450 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65   case the pcache
31460 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
31470 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  s an initialized
31480 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20   copy of.    ** 
31490 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e  the page. Return
314a0 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72   without further
314b0 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73   ado.  */.    as
314c0 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45  sert( pgno<=PAGE
314d0 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67  R_MAX_PGNO && pg
314e0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
314f0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
31500 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b   pPager->nHit++;
31510 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
31520 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
31530 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
31540 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
31550 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
31560 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
31570 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
31580 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
31590 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50  ..    pPg = *ppP
315a0 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  age;.    pPg->pP
315b0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a  ager = pPager;..
315c0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
315d0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
315e0 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
315f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
31600 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e   a page.    ** n
31610 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
31620 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20  an this, or the 
31630 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70  unused locking-p
31640 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65  age, is requeste
31650 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  d. */.    if( pg
31660 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
31670 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  O || pgno==PAGER
31680 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
31690 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
316a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
316b0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
316c0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
316d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
316e0 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72   MEMDB || pPager
316f0 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c  ->dbSize<pgno ||
31700 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69   noContent || !i
31710 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
31720 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
31730 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
31740 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
31750 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
31760 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
31770 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
31780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31790 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
317a0 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
317b0 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
317c0 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
317d0 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
317e0 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
317f0 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
31800 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
31810 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
31820 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
31830 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
31840 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
31850 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
31860 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
31870 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
31880 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
31890 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
318a0 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
318b0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
318c0 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
318d0 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
318e0 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
318f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31900 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
31910 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
31920 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
31930 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
31940 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
31950 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
31960 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
31970 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
31980 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
31990 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
319a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
319b0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
319c0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
319d0 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
319e0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
319f0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
31a00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
31a10 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
31a20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
31a30 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
31a40 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
31a50 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
31a60 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
31a70 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
31a80 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
31a90 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
31aa0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
31ab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
31ac0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
31ad0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
31ae0 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b   pPager->nMiss++
31af0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
31b00 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
31b10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31b30 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
31b40 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
31b50 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
31b60 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
31b70 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
31b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
31b90 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
31ba0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
31bb0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
31bc0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
31bd0 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
31be0 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
31bf0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
31c00 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61  Pager);..  *ppPa
31c10 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
31c20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
31c30 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
31c40 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
31c50 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
31c60 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
31c70 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
31c80 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
31c90 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
31ca0 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
31cb0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
31cc0 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a  not in cache. .*
31cd0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
31ce0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
31cf0 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
31d00 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
31d10 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
31d20 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
31d30 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
31d40 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
31d50 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
31d60 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
31d70 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
31d80 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
31d90 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
31da0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
31db0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
31dc0 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
31dd0 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
31de0 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
31df0 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
31e00 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
31e10 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
31e20 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
31e30 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
31e40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31e50 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
31e60 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
31e70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31e80 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
31e90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31ea0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
31eb0 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e  ADER && pPager->
31ec0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
31ed0 52 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ROR );.  sqlite3
31ee0 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
31ef0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
31f00 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72  o, 0, &pPg);.  r
31f10 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a  eturn pPg;.}../*
31f20 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
31f30 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a  ge reference..**
31f40 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
31f50 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
31f60 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
31f70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
31f80 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
31f90 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
31fa0 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
31fb0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
31fc0 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
31fd0 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
31fe0 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
31ff0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
32000 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
32010 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oved..*/.void sq
32020 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
32030 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
32040 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50  if( pPg ){.    P
32050 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
32060 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
32070 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
32080 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70  ease(pPg);.    p
32090 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
320a0 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ed(pPager);.  }.
320b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
320c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
320d0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
320e0 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
320f0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
32100 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
32110 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
32120 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
32130 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
32140 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
32150 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
32160 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
32170 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32180 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
32190 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
321a0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
321b0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
321c0 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
321d0 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
321e0 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
321f0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
32200 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
32210 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
32220 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
32230 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
32240 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
32250 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
32260 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
32270 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
32280 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
32290 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
322a0 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
322b0 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
322c0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
322d0 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
322e0 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
322f0 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
32300 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
32310 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
32320 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
32330 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
32340 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
32350 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
32360 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
32370 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
32380 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
32390 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
323a0 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
323b0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
323c0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
323d0 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
323e0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
323f0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
32400 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
32410 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
32420 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
32430 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
32440 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
32450 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
32460 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
32470 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
32480 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
32490 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
324a0 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
324b0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
324c0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
324d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
324e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
324f0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
32500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
32510 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
32520 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
32530 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
32540 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
32550 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
32560 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
32570 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32580 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
32590 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
325a0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
325b0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
325c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
325d0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
325e0 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
325f0 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
32600 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
32610 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32620 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
32630 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
32640 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
32650 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
32660 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
32670 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
32680 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
32690 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
326a0 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
326b0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
326c0 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70  rCode;..  if( !p
326d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
326e0 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  r) && pPager->jo
326f0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
32700 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
32710 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
32720 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
32730 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
32740 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
32750 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
32760 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
32770 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
32780 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
32790 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70    }.  .    /* Op
327a0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
327b0 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ile if it is not
327c0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a   already open. *
327d0 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  /.    if( !isOpe
327e0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
327f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
32800 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
32810 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32820 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
32830 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
32840 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
32850 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d  r->jfd);.      }
32860 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
32870 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
32880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32890 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74    /* VFS flags t
328a0 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  o open journal f
328b0 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
328c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
328d0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
328e0 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
328f0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
32900 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
32910 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
32920 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
32930 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
32940 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20  P_JOURNAL):.    
32950 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
32960 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
32970 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  L).          );.
32980 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
32990 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
329a0 49 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ITE.        rc =
329b0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
329c0 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20  pen(.           
329d0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
329e0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
329f0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
32a00 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
32a10 65 72 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  er).        );. 
32a20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72   #else.        r
32a30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
32a40 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
32a50 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
32a60 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
32a70 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20  ;.  #endif.     
32a80 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
32a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
32aa0 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
32ab0 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20  >jfd) );.    }. 
32ac0 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   .  .    /* Writ
32ad0 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
32ae0 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
32af0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
32b00 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  nd open .    ** 
32b10 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
32b20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
32b30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
32b40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32b50 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
32b60 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck if all of the
32b70 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65  se are really re
32b80 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
32b90 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
32ba0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
32bb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
32bc0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
32bd0 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
32be0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
32bf0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
32c00 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
32c10 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
32c20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
32c30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32c40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
32c50 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
32c60 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
32c70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
32c80 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65  ournal = 0;.  }e
32c90 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
32ca0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32cb0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
32cc0 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67  CKED );.    pPag
32cd0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
32ce0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
32cf0 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OD;.  }..  retur
32d00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
32d10 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
32d20 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
32d30 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
32d40 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
32d50 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
32d60 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
32d70 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
32d80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
32d90 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
32da0 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
32db0 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
32dc0 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
32dd0 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
32de0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
32df0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
32e00 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
32e10 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
32e20 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
32e30 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
32e40 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
32e50 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
32e60 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
32e70 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
32e80 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
32e90 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
32ea0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
32eb0 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
32ec0 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
32ed0 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
32ee0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
32ef0 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
32f00 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
32f10 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
32f20 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
32f30 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
32f40 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
32f50 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
32f60 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
32f70 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
32f80 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
32f90 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
32fa0 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
32fb0 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
32fc0 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
32fd0 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
32fe0 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
32ff0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
33000 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
33010 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
33020 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
33030 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
33040 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
33050 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
33060 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33070 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
33080 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
33090 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
330a0 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
330b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
330c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
330d0 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70  rCode ) return p
330e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
330f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33100 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
33110 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
33120 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45  ->eState<PAGER_E
33130 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72  RROR );.  pPager
33140 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
33150 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
33160 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  y;..  if( ALWAYS
33170 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
33180 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29  =PAGER_READER) )
33190 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
331a0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
331b0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
331c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
331d0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  er) ){.      /* 
331e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
331f0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
33200 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  e locking_mode=e
33210 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e  xclusive, and an
33220 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
33230 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
33240 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
33250 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62  already held, ob
33260 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20  tain it now..   
33270 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
33280 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
33290 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
332a0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
332b0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d  (pPager->pWal, -
332c0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
332d0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
332e0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
332f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
33300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33310 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
33320 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
33330 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
33340 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
33350 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
33360 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
33370 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65       /* Grab the
33380 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
33390 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20  he log file. If 
333a0 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72  successful, upgr
333b0 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ade to.      ** 
333c0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
333d0 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
333e0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
333f0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
33400 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ler..      ** Th
33410 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
33420 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66  s not invoked if
33430 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
33440 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ion already.    
33450 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77    ** holds the w
33460 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f  rite-lock. If po
33470 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65  ssible, the uppe
33480 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c  r layer will cal
33490 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  l it..      */. 
334a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
334b0 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72  3WalBeginWriteTr
334c0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
334d0 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  ->pWal);.    }el
334e0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  se{.      /* Obt
334f0 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
33500 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
33510 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
33520 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65   exFlag paramete
33530 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72  r.      ** is tr
33540 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61  ue, then immedia
33550 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69  tely upgrade thi
33560 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  s to an EXCLUSIV
33570 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
33580 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65    ** busy-handle
33590 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62  r callback can b
335a0 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72  e used when upgr
335b0 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43  ading to the EXC
335c0 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20  LUSIVE.      ** 
335d0 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
335e0 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
335f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
33600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
33610 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
33620 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
33630 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
33640 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33650 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  && exFlag ){.   
33660 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
33670 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
33680 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
33690 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
336a0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
336b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
336c0 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f      /* Change to
336d0 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
336e0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
336f0 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
33700 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61   sets Pager.eSta
33710 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54  te to PAGER_WRIT
33720 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43  ER_LOCKED or CAC
33730 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77  HEMOD.      ** w
33740 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70  hen it has an op
33750 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
33760 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d  but never to DBM
33770 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a  OD or FINISHED..
33780 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
33790 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73   because in thos
337a0 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64  e states the cod
337b0 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
337c0 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
337d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
337e0 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72  may copy data fr
337f0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
33800 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  al into the data
33810 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66  base .      ** f
33820 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69  ile as well as i
33830 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63  nto the page cac
33840 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20  he. Which would 
33850 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20  be incorrect in 
33860 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
33870 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  de..      */.   
33880 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
33890 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
338a0 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70  _LOCKED;.      p
338b0 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
338c0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
338d0 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
338e0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
338f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
33900 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f       pPager->dbO
33910 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72  rigSize = pPager
33920 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
33930 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
33940 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ff = 0;.    }.. 
33950 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
33960 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
33970 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33980 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
33990 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
339a0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
339b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
339c0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
339d0 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
339e0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
339f0 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20  Pager) );.  }.. 
33a00 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52   PAGERTRACE(("TR
33a10 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
33a20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
33a30 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
33a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
33a50 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67   single data pag
33a60 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
33a70 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
33a80 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
33a90 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72   main journal or
33aa0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20   sub-journal as 
33ab0 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65  required. If the
33ac0 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
33ad0 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20   into.** one of 
33ae0 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  the journals, th
33af0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
33b00 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68  bit is set in th
33b10 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  e .** Pager.pInJ
33b20 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e  ournal bitvec an
33b30 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
33b40 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
33b50 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20  t bitvecs.** of 
33b60 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  any open savepoi
33b70 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61  nts as appropria
33b80 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
33b90 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
33ba0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
33bb0 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
33bc0 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a  pData;.  Pager *
33bd0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
33be0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
33bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
33c00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
33c10 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c  s not called unl
33c20 65 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ess a write-tran
33c30 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
33c40 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73  ady .  ** been s
33c50 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72  tarted. The jour
33c60 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20  nal file may or 
33c70 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20  may not be open 
33c80 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  at this point.. 
33c90 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20   ** It is never 
33ca0 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52  called in the ER
33cb0 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a  ROR state..  */.
33cc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33cd0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
33ce0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
33cf0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
33d00 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
33d10 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
33d20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
33d30 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
33d40 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
33d50 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
33d60 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
33d70 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ger) );..  /* If
33d80 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65   an error has be
33d90 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65  en previously de
33da0 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74  tected, report t
33db0 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20  he same error.  
33dc0 2a 2a 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73  ** again. This s
33dd0 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e  hould not happen
33de0 2c 20 62 75 74 20 74 68 65 20 63 68 65 63 6b 20  , but the check 
33df0 70 72 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e  provides robustn
33e00 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ess. */.  if( NE
33e10 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
33e20 6f 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70  ode) )  return p
33e30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
33e40 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76  .  /* Higher-lev
33e50 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65  el routines neve
33e60 72 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  r call this func
33e70 74 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65  tion if database
33e80 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69   is not.  ** wri
33e90 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63  table.  But chec
33ea0 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66  k anyway, just f
33eb0 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a  or robustness. *
33ec0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
33ed0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ager->readOnly) 
33ee0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
33ef0 50 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  PERM;..  CHECK_P
33f00 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
33f10 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
33f20 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65   needs to be ope
33f30 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65  ned. Higher leve
33f40 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  l routines have 
33f50 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74  already.  ** obt
33f60 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73  ained the necess
33f70 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67  ary locks to beg
33f80 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  in the write-tra
33f90 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68  nsaction, but th
33fa0 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  e.  ** rollback 
33fb0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
33fc0 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f  t yet be open. O
33fd0 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68  pen it now if th
33fe0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
33ff0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
34000 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61  s done before ca
34010 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
34020 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f  cheMakeDirty() o
34030 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a  n the page. .  *
34040 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
34050 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74  it were done aft
34060 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  er calling sqlit
34070 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
34080 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  y(), then.  ** a
34090 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63  n error might oc
340a0 63 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65  cur and the page
340b0 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69  r would end up i
340c0 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
340d0 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20  state.  ** with 
340e0 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20  pages marked as 
340f0 64 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63  dirty in the cac
34100 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  he..  */.  if( p
34110 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
34120 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
34130 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ED ){.    rc = p
34140 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
34150 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
34160 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34170 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
34180 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
34190 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
341a0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
341b0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
341c0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
341d0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
341e0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
341f0 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
34200 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
34210 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
34220 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
34230 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
34240 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
34250 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ay..  */.  sqlit
34260 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
34270 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61  y(pPg);.  if( pa
34280 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
34290 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65   && !subjRequire
342a0 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
342b0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
342c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
342d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  ;.  }else{.  .  
342e0 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
342f0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
34300 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
34310 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
34320 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
34330 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
34340 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
34350 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
34360 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
34370 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
34380 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
34390 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
343a0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
343b0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
343c0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
343d0 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
343e0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
343f0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
34400 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
34410 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  ;.      if( pPg-
34420 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
34430 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f  bOrigSize && isO
34440 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
34450 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
34460 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
34470 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20  har *pData2;.   
34480 20 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20       i64 iOff = 
34490 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
344a0 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ff;..        /* 
344b0 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
344c0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
344d0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
344e0 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
344f0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
34500 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
34510 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
34520 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
34530 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
34540 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
34550 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
34560 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
34570 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
34580 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
34590 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
345a0 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lHdr<=pPager->jo
345b0 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
345c0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
345d0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
345e0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
345f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
34600 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  ta2);.        ck
34610 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
34620 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
34630 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20  Data2);..       
34640 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49   /* Even if an I
34650 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72  O or diskfull er
34660 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
34670 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65   journalling the
34680 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
34690 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
346a0 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
346b0 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
346c0 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20  the page..      
346d0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
346e0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
346f0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
34700 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
34710 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61  n.        ** pla
34720 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
34730 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74   will think that
34740 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
34750 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20  to be restored. 
34760 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
34770 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
34780 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72  And if an IO err
34790 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
347a0 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20  doing so,.      
347b0 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70    ** then corrup
347c0 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e  tion may follow.
347d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
347e0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
347f0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
34800 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  C;..        rc =
34810 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
34820 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20  ger->jfd, iOff, 
34830 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
34840 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34850 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
34860 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
34870 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
34880 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
34890 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
348a0 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  Size, iOff+4);. 
348b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
348c0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
348d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63  n rc;.        rc
348e0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
348f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66  Pager->jfd, iOff
34900 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
34910 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  e+4, cksum);.   
34920 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34930 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
34940 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54  rc;..        IOT
34950 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
34960 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
34970 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
34980 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
34990 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
349a0 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
349b0 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
349c0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
349d0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
349e0 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
349f0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
34a00 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
34a10 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
34a20 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
34a30 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
34a40 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
34a50 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
34a60 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
34a70 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
34a80 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70  C)?1:0), pager_p
34a90 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
34aa0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
34ab0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38  >journalOff += 8
34ac0 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
34ad0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ize;.        pPa
34ae0 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
34af0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
34b00 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
34b10 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
34b20 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
34b30 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
34b40 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
34b50 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
34b60 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
34b70 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
34b80 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
34b90 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
34ba0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
34bb0 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64         rc |= add
34bc0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
34bd0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
34be0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
34bf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34c00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
34c10 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
34c20 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
34c30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34c40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34c50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
34c60 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
34c70 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  !=PAGER_WRITER_D
34c80 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20  BMOD ){.        
34c90 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
34ca0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
34cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34cc0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
34cd0 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
34ce0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
34cf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34d00 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
34d10 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
34d20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
34d30 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
34d40 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
34d50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34d60 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
34d70 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
34d80 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
34d90 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
34da0 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
34db0 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
34dc0 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
34dd0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
34de0 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
34df0 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
34e00 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
34e10 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
34e20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
34e30 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
34e40 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
34e50 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
34e60 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
34e70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
34e80 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
34e90 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
34ea0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
34eb0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
34ec0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
34ed0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
34ee0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
34ef0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
34f00 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
34f10 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
34f20 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
34f30 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
34f40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
34f50 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
34f60 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
34f70 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
34f80 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
34f90 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61  e .** making cha
34fa0 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20  nges to a page. 
34fb0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
34fc0 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
34fd0 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68   value .** of th
34fe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
34ff0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
35000 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  o change any pag
35010 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a  e data unless .*
35020 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
35030 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
35040 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
35050 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
35060 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
35070 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
35080 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
35090 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
350a0 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
350b0 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
350c0 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
350d0 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
350e0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
350f0 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
35100 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
35110 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
35120 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
35130 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35140 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
35150 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
35160 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
35170 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
35180 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
35190 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61  returned.** as a
351a0 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65  ppropriate. Othe
351b0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
351c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
351d0 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
351e0 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
351f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
35200 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
35210 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
35220 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
35230 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
35240 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
35250 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
35260 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
35270 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73  ageSize);..  ass
35280 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35290 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
352a0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73  R_LOCKED );.  as
352b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
352c0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
352d0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
352e0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
352f0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
35300 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74  if( nPagePerSect
35310 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
35320 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
35330 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
35340 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
35350 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
35360 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
35370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35380 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
35390 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
353a0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
353b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
353c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
353d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
353e0 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
353f0 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
35400 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
35410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35420 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
35430 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  */.    int needS
35440 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ync = 0;        
35450 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
35460 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e  page has PGHDR_N
35470 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20  EED_SYNC */..   
35480 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
35490 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20  tSyncSpill flag 
354a0 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65  to 1. This is be
354b0 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20  cause we cannot 
354c0 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a  allow.    ** a j
354d0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
354e0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77   be written betw
354f0 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f  een the pages jo
35500 75 72 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a  urnaled by.    *
35510 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  * this function.
35520 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
35530 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
35540 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35550 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
35560 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
35570 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
35580 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  l++;..    /* Thi
35590 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20  s trick assumes 
355a0 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61  that both the pa
355b0 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
355c0 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20  or-size are.    
355d0 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f  ** an integer po
355e0 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74  wer of 2. It set
355f0 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74  s variable pg1 t
35600 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  o the identifier
35610 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
35620 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
35630 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
35640 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a  ocated on..    *
35650 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50  /.    pg1 = ((pP
35660 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e  g->pgno-1) & ~(n
35670 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
35680 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67  ) + 1;..    nPag
35690 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d  eCount = pPager-
356a0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28  >dbSize;.    if(
356b0 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
356c0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
356d0 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
356e0 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
356f0 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
35700 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
35710 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
35720 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
35730 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
35740 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35750 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
35760 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
35770 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
35780 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
35790 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
357a0 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
357b0 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
357c0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
357d0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
357e0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
357f0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
35800 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
35810 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
35820 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
35830 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
35840 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
35850 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
35860 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
35870 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
35880 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
35890 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
358a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
358b0 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
358c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
358d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
358e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
358f0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
35900 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
35910 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
35920 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
35930 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
35940 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
35950 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
35960 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
35970 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35980 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
35990 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
359a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
359b0 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
359c0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
359d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
359e0 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
359f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
35a00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
35a10 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
35a20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
35a30 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35a40 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
35a50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
35a60 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
35a70 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74  SYNC flag is set
35a80 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
35a90 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
35aa0 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
35ab0 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
35ac0 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
35ad0 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
35ae0 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
35af0 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
35b00 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
35b10 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
35b20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
35b30 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
35b40 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
35b50 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
35b60 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
35b70 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
35b80 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
35b90 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
35ba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
35bb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
35bc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
35bd0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
35be0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
35bf0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
35c00 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b  0; ii<nPage; ii+
35c10 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64  +){.        PgHd
35c20 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72  r *pPage = pager
35c30 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
35c40 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20  pg1+ii);.       
35c50 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
35c60 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66          pPage->f
35c70 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
35c80 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
35c90 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
35ca0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
35cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
35cc0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
35cd0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
35ce0 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20  yncSpill==1 );. 
35cf0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
35d00 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d  SyncSpill--;.  }
35d10 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
35d20 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
35d30 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
35d40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
35d50 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
35d60 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
35d70 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
35d80 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
35d90 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
35da0 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
35db0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
35dc0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
35dd0 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
35de0 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
35df0 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
35e00 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
35e10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
35e20 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
35e30 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
35e40 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  n pPg->flags&PGH
35e50 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64  DR_DIRTY;.}.#end
35e60 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
35e70 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
35e80 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
35e90 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
35ea0 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
35eb0 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
35ec0 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
35ed0 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
35ee0 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
35ef0 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
35f00 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
35f10 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70  dirty.  This hap
35f20 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
35f30 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, when.** the p
35f40 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64  age has been add
35f50 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20  ed as a leaf of 
35f60 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
35f70 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65   so its.** conte
35f80 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74  nt no longer mat
35f90 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ters..**.** The 
35fa0 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
35fb0 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
35fc0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
35fd0 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
35fe0 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
35ff0 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
36000 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
36010 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
36020 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
36030 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
36040 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
36050 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
36060 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
36070 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72  zation can quadr
36080 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
36090 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45  f large .** DELE
360a0 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  TE operations..*
360b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
360c0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48  gerDontWrite(PgH
360d0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
360e0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
360f0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28  >pPager;.  if( (
36100 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
36110 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65  _DIRTY) && pPage
36120 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
36130 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
36140 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE(("DONT_WRITE 
36150 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
36160 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
36170 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
36180 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
36190 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
361a0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
361b0 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ).    pPg->flags
361c0 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57   |= PGHDR_DONT_W
361d0 52 49 54 45 3b 0a 20 20 20 20 70 61 67 65 72 5f  RITE;.    pager_
361e0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
361f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
36200 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
36210 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
36220 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ent the value of
36230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36240 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f  le .** change-co
36250 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73  unter, stored as
36260 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 4-byte big-en
36270 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61  dian integer sta
36280 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74  rting at .** byt
36290 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74  e offset 24 of t
362a0 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 20 20  he pager file.  
362b0 54 68 65 20 73 65 63 6f 6e 64 61 72 79 20 63 68  The secondary ch
362c0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 74 0a  ange counter at.
362d0 2a 2a 20 39 32 20 69 73 20 61 6c 73 6f 20 75 70  ** 92 is also up
362e0 64 61 74 65 64 2c 20 61 73 20 69 73 20 74 68 65  dated, as is the
362f0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
36300 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
36310 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74   96..**.** But t
36320 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
36330 20 69 66 20 74 68 65 20 70 50 61 67 65 72 2d 3e   if the pPager->
36340 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
36350 66 6c 61 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a  flag is false..*
36360 2a 20 54 6f 20 61 76 6f 69 64 20 65 78 63 65 73  * To avoid exces
36370 73 20 63 68 75 72 6e 69 6e 67 20 6f 66 20 70 61  s churning of pa
36380 67 65 20 31 2c 20 74 68 65 20 75 70 64 61 74 65  ge 1, the update
36390 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e   only happens on
363a0 63 65 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  ce..** See also 
363b0 74 68 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  the pager_write_
363c0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
363d0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65  routine that doe
363e0 73 20 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69  s an .** uncondi
363f0 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f 66  tional update of
36400 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
36410 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ters..**.** If t
36420 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
36430 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68  flag is zero, th
36440 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  en this is done 
36450 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  by calling .** s
36460 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36470 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  () on page 1, th
36480 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  en modifying the
36490 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
364a0 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49  .** page data. I
364b0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
364c0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64  file will be upd
364d0 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  ated when the cu
364e0 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
364f0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
36500 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44  d..**.** The isD
36510 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d  irectMode flag m
36520 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a  ay only be non-z
36530 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61  ero if the libra
36540 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a  ry was compiled.
36550 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ** with the SQLI
36560 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
36570 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66  _WRITE macro def
36580 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ined. In this ca
36590 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65  se,.** if isDire
365a0 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ct is non-zero, 
365b0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
365c0 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  e file is update
365d0 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79  d directly.** by
365e0 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61   writing an upda
365f0 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ted version of p
36600 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61  age 1 using a ca
36610 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71  ll to the .** sq
36620 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66  lite3OsWrite() f
36630 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
36640 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
36650 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
36660 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
36670 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29  nt isDirectMode)
36680 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
36690 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
366a0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
366b0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
366c0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
366d0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
366e0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
366f0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
36700 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
36710 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
36720 29 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65  );..  /* Declare
36730 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
36740 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
36750 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20   'isDirect'. If 
36760 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d  the.  ** atomic-
36770 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
36780 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e  on is enabled in
36790 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65   this build, the
367a0 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20  n isDirect.  ** 
367b0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
367c0 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
367d0 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65  ed as the isDire
367e0 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  ctMode parameter
367f0 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  .  ** to this fu
36800 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
36810 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
36820 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  set to zero..  *
36830 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20  *.  ** The idea 
36840 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61  is that if the a
36850 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
36860 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  mization is not.
36870 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20    ** enabled at 
36880 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
36890 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f  e compiler can o
368a0 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66  mit the tests of
368b0 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27  .  ** 'isDirect'
368c0 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20   below, as well 
368d0 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63  as the block enc
368e0 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a  losed in the.  *
368f0 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20  * "if( isDirect 
36900 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20  )" condition..  
36910 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
36920 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
36930 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44  WRITE.# define D
36940 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61  IRECT_MODE 0.  a
36950 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d  ssert( isDirectM
36960 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  ode==0 );.  UNUS
36970 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
36980 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73  irectMode);.#els
36990 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  e.# define DIREC
369a0 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d  T_MODE isDirectM
369b0 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  ode.#endif..  if
369c0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
369d0 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50  eCountDone && pP
369e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
369f0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
36a00 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
36a10 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
36a20 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20   to page 1 */.. 
36a30 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
36a40 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
36a50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
36a60 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  d) );..    /* Op
36a70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
36a80 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
36a90 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
36aa0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
36ab0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
36ac0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
36ad0 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d  pPgHdr==0 || rc=
36ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
36af0 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e     /* If page on
36b00 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75  e was fetched su
36b10 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20  ccessfully, and 
36b20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
36b30 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72   not.    ** oper
36b40 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d  ating in direct-
36b50 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20  mode, make page 
36b60 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65  1 writable.  Whe
36b70 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a  n not in .    **
36b80 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61   direct mode, pa
36b90 67 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68  ge 1 is always h
36ba0 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64  eld in cache and
36bb0 20 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72   hence the Pager
36bc0 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  Get().    ** abo
36bd0 76 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63  ve is always suc
36be0 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20  cessful - hence 
36bf0 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63  the ALWAYS on rc
36c00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20  ==SQLITE_OK..   
36c10 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52   */.    if( !DIR
36c20 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41  ECT_MODE && ALWA
36c30 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  YS(rc==SQLITE_OK
36c40 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
36c50 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
36c60 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d  e(pPgHdr);.    }
36c70 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
36c80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36c90 20 2f 2a 20 41 63 74 75 61 6c 6c 79 20 64 6f 20   /* Actually do 
36ca0 74 68 65 20 75 70 64 61 74 65 20 6f 66 20 74 68  the update of th
36cb0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
36cc0 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f   */.      pager_
36cd0 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
36ce0 74 65 72 28 70 50 67 48 64 72 29 3b 0a 0a 20 20  ter(pPgHdr);..  
36cf0 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
36d00 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
36d10 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
36d20 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
36d30 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
36d40 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f       if( DIRECT_
36d50 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MODE ){.        
36d60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
36d70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
36d80 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
36d90 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
36da0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
36db0 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20   pPgHdr->pData, 
36dc0 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f  1, 6, rc=SQLITE_
36dd0 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20  NOMEM, zBuf);.  
36de0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36e00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36e10 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
36e20 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
36e30 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
36e40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36e50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36e60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36e70 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
36e80 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
36e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36ea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
36eb0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
36ec0 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
36ed0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
36ee0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
36ef0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
36f00 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
36f10 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
36f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36f30 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
36f40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36f50 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73  to disk. This is
36f60 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d   a no-op for in-
36f70 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
36f80 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74  .** or pages wit
36f90 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  h the Pager.noSy
36fa0 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  nc flag set..**.
36fb0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
36fc0 2c 20 6f 72 20 69 66 20 63 61 6c 6c 65 64 20 6f  , or if called o
36fd0 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68  n a pager for wh
36fe0 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ich it is a no-o
36ff0 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  p, this.** funct
37000 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
37010 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
37020 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
37030 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
37040 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37050 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
37060 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
37070 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37080 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
37090 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
370a0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
370b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
370c0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
370d0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
370e0 73 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  s);.  }else if( 
370f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
37100 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
37110 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
37120 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
37130 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
37140 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
37150 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 2c  TL_SYNC_OMITTED,
37160 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
37170 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
37180 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
37190 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
371a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
371b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
371c0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
371d0 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65   be called while
371e0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
371f0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 69  tion is active i
37200 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  n.** rollback. I
37210 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
37220 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
37230 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
37240 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72  no-op. .** Other
37250 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e  wise, if the con
37260 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  nection does not
37270 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 6e   already have an
37280 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
37290 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  on .** the datab
372a0 61 73 65 20 66 69 6c 65 2c 20 61 6e 20 61 74 74  ase file, an att
372b0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
372c0 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a  obtain one..**.*
372d0 2a 20 49 66 20 74 68 65 20 45 58 43 4c 55 53 49  * If the EXCLUSI
372e0 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  VE lock is alrea
372f0 64 79 20 68 65 6c 64 20 6f 72 20 74 68 65 20 61  dy held or the a
37300 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
37310 20 69 74 20 69 73 0a 2a 2a 20 73 75 63 63 65 73   it is.** succes
37320 73 66 75 6c 2c 20 6f 72 20 74 68 65 20 63 6f 6e  sful, or the con
37330 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41  nection is in WA
37340 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f 4f  L mode, SQLITE_O
37350 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
37360 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 65 69 74  * Otherwise, eit
37370 68 65 72 20 53 51 4c 49 54 45 5f 42 55 53 59 20  her SQLITE_BUSY 
37380 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  or an SQLITE_IOE
37390 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
373a0 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
373b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
373c0 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
373d0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
373e0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
373f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
37400 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
37410 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37420 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20 20 20 20  _CACHEMOD .     
37430 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37440 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37450 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20 20 20 20  R_DBMOD .       
37460 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37470 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37480 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a 20 20 61  LOCKED .  );.  a
37490 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
374a0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
374b0 29 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70 61  ) );.  if( 0==pa
374c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
374d0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  ) ){.    rc = pa
374e0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
374f0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
37500 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  VE_LOCK);.  }.  
37510 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37520 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
37530 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
37540 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
37550 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
37560 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
37570 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
37580 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
37590 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
375a0 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
375b0 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
375c0 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
375d0 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
375e0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
375f0 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
37600 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
37610 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
37620 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
37630 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
37640 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s that:.**.**   
37650 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
37660 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
37670 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  er is updated,.*
37680 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61  *   * the journa
37690 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c  l is synced (unl
376a0 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ess the atomic-w
376b0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
376c0 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20  n is used),.**  
376d0 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67   * all dirty pag
376e0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  es are written t
376f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
37700 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65  ile, .**   * the
37710 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
37720 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20  s truncated (if 
37730 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a  required), and.*
37740 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
37750 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
37760 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
37770 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69  thing that remai
37780 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
37790 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
377a0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20  to finalize .** 
377b0 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
377c0 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69  e or zero the fi
377d0 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65  rst part of) the
377e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
377f0 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  r .** delete the
37800 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
37810 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
37820 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
37830 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
37840 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
37850 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
37860 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
37870 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
37880 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
37890 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
378a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
378b0 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
378c0 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
378d0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
378e0 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
378f0 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
37900 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
37910 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
37920 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
37930 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
37940 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37950 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
37960 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
37970 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
37980 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
37990 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
379a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
379b0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
379c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
379d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379e0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
379f0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
37a00 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20  r *zMaster,     
37a10 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
37a20 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65   NULL, the maste
37a30 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
37a40 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20  /.  int noSync  
37a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a60 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
37a70 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e  mit the xSync on
37a80 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
37a90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
37aa0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
37ab0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
37ac0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
37ad0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37ae0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
37af0 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
37b00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37b10 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
37b20 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
37b30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37b40 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
37b50 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
37b60 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37b70 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 20 20  ER_ERROR.  );.  
37b80 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
37b90 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
37ba0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  r) );..  /* If a
37bb0 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63   prior error occ
37bc0 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74 68  urred, report th
37bd0 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e 20  at error again. 
37be0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
37bf0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
37c00 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
37c10 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47  >errCode;..  PAG
37c20 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42 41  ERTRACE(("DATABA
37c30 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
37c40 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a   zMaster=%s nSiz
37c50 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  e=%d\n", .      
37c60 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
37c70 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  e, zMaster, pPag
37c80 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20  er->dbSize));.. 
37c90 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61 62 61   /* If no databa
37ca0 73 65 20 63 68 61 6e 67 65 73 20 68 61 76 65 20  se changes have 
37cb0 62 65 65 6e 20 6d 61 64 65 2c 20 72 65 74 75 72  been made, retur
37cc0 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66  n early. */.  if
37cd0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37ce0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  <PAGER_WRITER_CA
37cf0 43 48 45 4d 4f 44 20 29 20 72 65 74 75 72 6e 20  CHEMOD ) return 
37d00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
37d10 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f  ( MEMDB ){.    /
37d20 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
37d30 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
37d40 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
37d50 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
37d60 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66  or this.    ** f
37d70 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
37d80 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
37d90 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20   it is mostly a 
37da0 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c  no-op.  However,
37db0 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b   any.    ** back
37dc0 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e  up in progress n
37dd0 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 61  eeds to be resta
37de0 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rted..    */.   
37df0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
37e00 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
37e10 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  ackup);.  }else{
37e20 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
37e30 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
37e40 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69        PgHdr *pLi
37e50 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
37e60 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
37e70 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
37e80 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
37e90 4f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  One = 0;.      i
37ea0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
37eb0 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 68         /* Must h
37ec0 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
37ed0 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 57 41   page for the WA
37ee0 4c 20 63 6f 6d 6d 69 74 20 66 6c 61 67 2e 0a 20  L commit flag.. 
37ef0 20 20 20 20 20 20 20 2a 2a 20 54 69 63 6b 65 74         ** Ticket
37f00 20 5b 32 64 31 61 35 63 36 37 64 66 63 32 33 36   [2d1a5c67dfc236
37f10 33 65 34 34 66 32 39 64 39 62 62 64 35 37 66 5d  3e44f29d9bbd57f]
37f20 20 32 30 31 31 2d 30 35 2d 31 38 20 2a 2f 0a 20   2011-05-18 */. 
37f30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
37f40 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
37f50 65 72 2c 20 31 2c 20 26 70 50 61 67 65 4f 6e 65  er, 1, &pPageOne
37f60 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
37f70 20 3d 20 70 50 61 67 65 4f 6e 65 3b 0a 20 20 20   = pPageOne;.   
37f80 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 44 69 72       pList->pDir
37f90 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ty = 0;.      }.
37fa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
37fb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
37fc0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
37fd0 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
37fe0 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46    rc = pagerWalF
37ff0 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 4c  rames(pPager, pL
38000 69 73 74 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ist, pPager->dbS
38010 69 7a 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ize, 1);.      }
38020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
38030 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 4f 6e  gerUnref(pPageOn
38040 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
38050 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
38060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63         sqlite3Pc
38070 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
38080 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
38090 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
380a0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  {.      /* The f
380b0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75  ollowing block u
380c0 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
380d0 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74  e-counter. Exact
380e0 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20 20  ly how it.      
380f0 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65 70  ** does this dep
38100 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
38110 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
38120 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
38130 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ation.      ** w
38140 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
38150 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20  mpile time, and 
38160 69 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  if this transact
38170 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20  ion meets the . 
38180 20 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20       ** runtime 
38190 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65 20  criteria to use 
381a0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a  the operation: .
381b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
381c0 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d  *    * The file-
381d0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
381e0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
381f0 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20   property for.  
38200 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63      **      bloc
38210 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d  ks of size page-
38220 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 20  size, and .     
38230 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f   **    * This co
38240 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  mmit is not part
38250 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
38260 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e   transaction, an
38270 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20  d.      **    * 
38280 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  Exactly one page
38290 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
382a0 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ed and store in 
382b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
382c0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
382d0 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d   ** If the optim
382e0 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  ization was not 
382f0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
38300 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68  le time, then th
38310 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  e.      ** pager
38320 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
38330 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ter() function i
38340 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61  s called to upda
38350 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20  te the change.  
38360 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69      ** counter i
38370 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65  n 'indirect-mode
38380 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  '. If the optimi
38390 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c  zation is compil
383a0 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 20 20  ed in but.      
383b0 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63  ** is not applic
383c0 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61  able to this tra
383d0 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73  nsaction, call s
383e0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
383f0 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74  ate().      ** t
38400 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
38410 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
38420 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63   actually been c
38430 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c  reated, then cal
38440 6c 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  l.      ** pager
38450 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
38460 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20  ter() to update 
38470 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
38480 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20  er in indirect. 
38490 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20       ** mode. . 
384a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
384b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
384c0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
384d0 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64 20  is both enabled 
384e0 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a  and applicable,.
384f0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61        ** then ca
38500 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ll pager_incr_ch
38510 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f  angecounter() to
38520 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
38530 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 20  ge-counter.     
38540 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20   ** in 'direct' 
38550 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  mode. In this ca
38560 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
38570 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ile will never b
38580 65 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74  e.      ** creat
38590 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e  ed for this tran
385a0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
385b0 2f 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  /.  #ifdef SQLIT
385c0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
385d0 57 52 49 54 45 0a 20 20 20 20 20 20 50 67 48 64  WRITE.      PgHd
385e0 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 61 73  r *pPg;.      as
385f0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
38600 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  ger->jfd) .     
38610 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
38620 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
38630 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
38640 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
38650 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
38660 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
38670 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
38680 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
38690 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73  ( !zMaster && is
386a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
386b0 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  ) .       && pPa
386c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
386d0 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28  =jrnlBufferSize(
386e0 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20  pPager) .       
386f0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
38700 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  e>=pPager->dbOri
38710 67 53 69 7a 65 0a 20 20 20 20 20 20 20 26 26 20  gSize.       && 
38720 28 30 3d 3d 28