/ Hex Artifact Content
Login

Artifact 0c6cebb314597cbd65c2a7dfdcd1d8fba97b1741:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61 67    u8 walSyncFlag
7200: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77 61  SYNC_FULL for wa
7230: 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75 38  l writes */.  u8
7240: 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20   syncFlags;     
7250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7260: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7270: 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 20  _FULL otherwise 
7280: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
7290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
72a0: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
72b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
72c0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
72d0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
72e0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
72f0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
7300: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ase */.  u8 memD
7310: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
7320: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
7330: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
7340: 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a   I/O */..  /****
7350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7390: 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ******.  ** The 
73a0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
73b0: 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63  contains those c
73c0: 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61  lass members tha
73d0: 74 20 63 68 61 6e 67 65 20 64 75 72 69 6e 67 0a  t change during.
73e0: 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6f 70 65    ** routine ope
73f0: 72 74 69 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65  rtion.  Class me
7400: 6d 62 65 72 73 20 6e 6f 74 20 69 6e 20 74 68 69  mbers not in thi
7410: 73 20 62 6c 6f 63 6b 20 61 72 65 20 65 69 74 68  s block are eith
7420: 65 72 20 66 69 78 65 64 0a 20 20 2a 2a 20 77 68  er fixed.  ** wh
7430: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
7440: 66 69 72 73 74 20 63 72 65 61 74 65 64 20 6f 72  first created or
7450: 20 65 6c 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67   else only chang
7460: 65 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  e when there is 
7470: 61 0a 20 20 2a 2a 20 73 69 67 6e 69 66 69 63 61  a.  ** significa
7480: 6e 74 20 6d 6f 64 65 20 63 68 61 6e 67 65 20 28  nt mode change (
7490: 73 75 63 68 20 61 73 20 63 68 61 6e 67 69 6e 67  such as changing
74a0: 20 74 68 65 20 70 61 67 65 5f 73 69 7a 65 2c 20   the page_size, 
74b0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20  locking_mode,.  
74c0: 2a 2a 20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  ** or the journa
74d0: 6c 5f 6d 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61  l_mode).  From a
74e0: 6e 6f 74 68 65 72 20 76 69 65 77 2c 20 74 68 65  nother view, the
74f0: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7500: 20 64 65 73 63 72 69 62 65 0a 20 20 2a 2a 20 74   describe.  ** t
7510: 68 65 20 22 73 74 61 74 65 22 20 6f 66 20 74 68  he "state" of th
7520: 65 20 70 61 67 65 72 2c 20 77 68 69 6c 65 20 6f  e pager, while o
7530: 74 68 65 72 20 63 6c 61 73 73 20 6d 65 6d 62 65  ther class membe
7540: 72 73 20 64 65 73 63 72 69 62 65 20 74 68 65 0a  rs describe the.
7550: 20 20 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74    ** "configurat
7560: 69 6f 6e 22 20 6f 66 20 74 68 65 20 70 61 67 65  ion" of the page
7570: 72 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74  r..  */.  u8 eSt
7580: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
7590: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
75a0: 74 61 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44  tate (OPEN, READ
75b0: 45 52 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  ER, WRITER_LOCKE
75c0: 44 2e 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f  D..) */.  u8 eLo
75d0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
75e0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
75f0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61   lock held on da
7600: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7610: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
7620: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
7630: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
7640: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
7650: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  e-counter */.  u
7660: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
7670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7680: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
7690: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
76a0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
76b0: 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20  8 doNotSpill;   
76c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
76d0: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
76e0: 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65  ache when non-ze
76f0: 72 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74  ro */.  u8 doNot
7700: 53 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20  SyncSpill;      
7710: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f      /* Do not do
7720: 20 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65   a spill that re
7730: 71 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63  quires jrnl sync
7740: 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d   */.  u8 subjInM
7750: 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  emory;          
7760: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7770: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a   in-memory sub-j
7780: 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e  ournals */.  Pgn
7790: 6f 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  o dbSize;       
77a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
77b0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
77c0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
77d0: 20 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65   Pgno dbOrigSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68  dbSize before th
7800: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
7810: 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20  ction */.  Pgno 
7820: 64 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  dbFileSize;     
7830: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7840: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7850: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7860: 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53  /.  Pgno dbHintS
7870: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7880: 2f 2a 20 56 61 6c 75 65 20 70 61 73 73 65 64 20  /* Value passed 
7890: 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  to FCNTL_SIZE_HI
78a0: 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  NT call */.  int
78b0: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
78c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
78d0: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
78e0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
78f0: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
7900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7910: 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  ages journalled 
7920: 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61  since last j-hea
7930: 64 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  der written */. 
7940: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7960: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
7970: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
7980: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
7990: 75 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20  u32 nSubRec;    
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
79b0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
79c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d   written to sub-
79d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74  journal */.  Bit
79e0: 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b  vec *pInJournal;
79f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
7a00: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
7a10: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
7a20: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  e file */.  sqli
7a30: 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20  te3_file *fd;   
7a40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
7a50: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64  descriptor for d
7a60: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
7a70: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
7a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7a90: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7aa0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
7ab0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ac0: 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  sjfd;         /*
7ad0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ae0: 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   for sub-journal
7af0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
7b00: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
7b10: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69    /* Current wri
7b20: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
7b30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
7b40: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
7b50: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
7b60: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
7b70: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
7b80: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71  l header */.  sq
7b90: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
7ba0: 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69  ackup;    /* Poi
7bb0: 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20  nter to list of 
7bc0: 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70  ongoing backup p
7bd0: 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61  rocesses */.  Pa
7be0: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53  gerSavepoint *aS
7bf0: 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72  avepoint; /* Arr
7c00: 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61 76  ay of active sav
7c10: 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  epoints */.  int
7c20: 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20   nSavepoint;    
7c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7c40: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
7c50: 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a  n aSavepoint[] *
7c60: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
7c70: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
7c80: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
7c90: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
7ca0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 2f  e changes */.  /
7cb0: 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68  *.  ** End of th
7cc0: 65 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e  e routinely-chan
7cd0: 67 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65  ging class membe
7ce0: 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rs.  ***********
7cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d30: 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b  /..  u16 nExtra;
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
7d60: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
7d70: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
7d80: 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65  /.  i16 nReserve
7d90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7da0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
7db0: 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64  sed bytes at end
7dc0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f   of each page */
7dd0: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7df0: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
7e00: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
7e10: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
7e20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7e30: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
7e40: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
7e50: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
7e60: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
7e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e80: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
7e90: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
7ea0: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
7eb0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
7ec0: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
7ed0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
7ee0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
7ef0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
7f00: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
7f10: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
7f20: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
7f30: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7f50: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
7f60: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
7f70: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
7f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
7f90: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
7fa0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
7fb0: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
7fc0: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
7fd0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
7fe0: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
7ff0: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
8000: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
8010: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
8020: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
8030: 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b  int nHit, nMiss;
8040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8050: 6f 74 61 6c 20 63 61 63 68 65 20 68 69 74 73 20  otal cache hits 
8060: 61 6e 64 20 6d 69 73 73 65 73 20 2a 2f 0a 23 69  and misses */.#i
8070: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8080: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
8090: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
80a0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
80b0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
80c0: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
80d0: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
80e0: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
80f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8100: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8110: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8120: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
8130: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
8140: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
8150: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
8160: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
8170: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
8180: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
8190: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
81a0: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
81b0: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
81c0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
81d0: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
81e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
81f0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8200: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8210: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8230: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
8240: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
8250: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
8260: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
8270: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
8280: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8290: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
82a0: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
82b0: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
82c0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
82d0: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
82e0: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
82f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8300: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8320: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
8330: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
8340: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
8350: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8370: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
8380: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
8390: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
83a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
83b0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
83c0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
83d0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
83e0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
83f0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8400: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8410: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8420: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8430: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
8440: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
8450: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
8460: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
8470: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
8480: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8490: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
84a0: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
84b0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
84c0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
84d0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
84e0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
84f0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8500: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8510: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8520: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8530: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
8540: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
8550: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
8560: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
8570: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
8580: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
8590: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
85a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
85b0: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
85c0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
85d0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
85e0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
85f0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8600: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8610: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8620: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8630: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
8640: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
8650: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
8660: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
8670: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8680: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
8690: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
86a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
86b0: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
86c0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
86d0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
86e0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
86f0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8700: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8710: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8720: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8730: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
8740: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
8750: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
8760: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
8770: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
8780: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
8790: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
87a0: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
87b0: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
87c0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
87d0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
87e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
87f0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8800: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8810: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8820: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8830: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
8840: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
8850: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
8860: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
8870: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
8880: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
8890: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
88a0: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
88b0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
88c0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
88d0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
88e0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
88f0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8900: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8910: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8920: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8930: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
8940: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
8950: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
8960: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
8970: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
8980: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
8990: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
89a0: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
89b0: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
89c0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
89d0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
89e0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
89f0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
8a00: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
8a10: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
8a20: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
8a30: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
8a40: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
8a50: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
8a60: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
8a70: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
8a80: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
8a90: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
8aa0: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
8ab0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
8ac0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
8ad0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
8ae0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
8af0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
8b00: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
8b10: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
8b20: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
8b30: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
8b40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
8b50: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
8b60: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
8b70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8b80: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
8b90: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
8ba0: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
8bb0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
8bc0: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
8bd0: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
8be0: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
8bf0: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
8c00: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
8c10: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
8c20: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
8c30: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8c40: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8c50: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
8c60: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
8c70: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
8c80: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
8c90: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
8ca0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8cb0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
8cc0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
8cd0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
8ce0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8cf0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
8d00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
8d10: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
8d20: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
8d30: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
8d40: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
8d50: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
8d60: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
8d70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
8d80: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
8d90: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
8da0: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
8db0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
8dc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
8dd0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
8de0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
8df0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
8e00: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
8e10: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
8e20: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
8e30: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
8e40: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
8e50: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
8e60: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
8e70: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
8e80: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
8e90: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
8ea0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
8eb0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
8ec0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
8ed0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
8ee0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
8ef0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8f00: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
8f10: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
8f20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
8f30: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
8f40: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
8f50: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
8f60: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
8f70: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
8f80: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
8f90: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
8fa0: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
8fb0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
8fc0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
8fd0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
8fe0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8ff0: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
9000: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
9010: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9020: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
9030: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
9040: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
9050: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
9060: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
9070: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
9080: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
9090: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20 30  rames(v,w,x,y) 0
90a0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f  .# define pagerO
90b0: 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
90c0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64  z) SQLITE_OK.# d
90d0: 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69 6e  efine pagerBegin
90e0: 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
90f0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  z) SQLITE_OK.#en
9100: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
9110: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
9120: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
9130: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
9140: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
9150: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9160: 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73  ion runs many as
9170: 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20  serts to try to 
9180: 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e  find inconsisten
9190: 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69  cies in.** the i
91a0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
91b0: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
91c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
91d0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
91e0: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
91f0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
9200: 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   p;..  /* State 
9210: 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a  must be valid. *
9220: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  /.  assert( p->e
9230: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
9240: 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  N.       || p->e
9250: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
9260: 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DER.       || p-
9270: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9280: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
9290: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
92a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
92b0: 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
92c0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
92d0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
92e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
92f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9300: 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
9310: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9320: 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
9330: 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73  ..  /* Regardles
9340: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
9350: 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66   state, a temp-f
9360: 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ile connection a
9370: 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20  lways behaves.  
9380: 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20  ** as if it has 
9390: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
93a0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
93b0: 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72  e file. It never
93c0: 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68   updates.  ** th
93d0: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
93e0: 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63   field, so the c
93f0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
9400: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
9410: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
9420: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
9430: 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58   || p->eLock==EX
9440: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
9450: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9460: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
9470: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9480: 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  one );..  /* If 
9490: 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66  the useJournal f
94a0: 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
94b0: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d  e journal-mode m
94c0: 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20  ust be "OFF". . 
94d0: 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a   ** And if the j
94e0: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22  ournal-mode is "
94f0: 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61  OFF", the journa
9500: 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20  l file must not 
9510: 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  be open..  */.  
9520: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9530: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9540: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9550: 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29   p->useJournal )
9560: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  ;.  assert( p->j
9570: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
9580: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9590: 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e  F || !isOpen(p->
95a0: 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  jfd) );..  /* Ch
95b0: 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69  eck that MEMDB i
95c0: 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41  mplies noSync. A
95d0: 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nd an in-memory 
95e0: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a  journal. Since .
95f0: 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20    ** this means 
9600: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9610: 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49  er performs no I
9620: 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e  O at all, it can
9630: 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20  not encounter . 
9640: 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54   ** either SQLIT
9650: 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
9660: 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f  E_FULL during ro
9670: 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20  llback or while 
9680: 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a  finalizing .  **
9690: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
96a0: 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69   (although the i
96b0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
96c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
96d0: 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e  may .  ** return
96e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
96f0: 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  MEM while the jo
9700: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
9710: 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74  ing written). It
9720: 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66   .  ** is theref
9730: 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  ore not possible
9740: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
9750: 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  y pager to enter
9760: 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a   the ERROR .  **
9770: 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
9780: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
9790: 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e  assert( p->noSyn
97a0: 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c );.    assert(
97b0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
97c0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
97d0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
97e0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
97f0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9800: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9810: 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
9820: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9830: 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53  R_ERROR && p->eS
9840: 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
9850: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9860: 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d  pagerUseWal(p)==
9870: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0 );.  }..  /* I
9880: 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  f changeCountDon
9890: 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53 45  e is set, a RESE
98a0: 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65  RVED lock or gre
98b0: 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
98c0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69  d.  ** on the fi
98d0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
98e0: 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  t( pPager->chang
98f0: 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c  eCountDone==0 ||
9900: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
9910: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
9920: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c  .  assert( p->eL
9930: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
9940: 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  K );..  switch( 
9950: 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  p->eState ){.   
9960: 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e   case PAGER_OPEN
9970: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9980: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20  !MEMDB );.      
9990: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
99a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
99b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
99c0: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
99d0: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
99e0: 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c  ->pPCache)==0 ||
99f0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
9a00: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
9a10: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
9a20: 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20  R_READER:.      
9a30: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9a40: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9a50: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
9a60: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9a70: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9a80: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9a90: 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
9aa0: 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64 6c 6f  K || p->noReadlo
9ab0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ck );.      brea
9ac0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9ad0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
9ae0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9af0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9b00: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9b10: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9b20: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9b30: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
9b40: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
9b50: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
9b60: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9b70: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9b80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9b90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ba0: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
9bb0: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
9bc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9bd0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9be0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
9bf0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9c00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9c10: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9c20: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
9c30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9c40: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
9c50: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
9c60: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
9c70: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
9c80: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9c90: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9ca0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9cb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9cc0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9cd0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9ce0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9cf0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9d00: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
9d10: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
9d20: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
9d30: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
9d40: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
9d50: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
9d60: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
9d70: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
9d80: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
9d90: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
9da0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
9db0: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
9dc0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
9dd0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
9de0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
9df0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9e00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9e10: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9e20: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
9e30: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
9e40: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
9e50: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9e60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9e70: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9e80: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
9e90: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9ea0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
9eb0: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
9ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9ed0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
9ee0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
9ef0: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
9f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9f10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
9f20: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
9f30: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
9f40: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f50: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
9f60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f70: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
9f80: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
9f90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9fa0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9fb0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9fc0: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
9fd0: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
9fe0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9ff0: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a000: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a010: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a020: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a030: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a040: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a050: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a060: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a070: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a080: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a090: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a0a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a0b0: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a0c0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a0d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a0e0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a0f0: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a100: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a110: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a120: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a130: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a140: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a150: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a160: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a170: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a180: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a190: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a1a0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a1b0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a1c0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a1d0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a1e0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a1f0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a200: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a210: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a220: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a230: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a240: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a250: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a260: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a270: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a280: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a290: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a2a0: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a2b0: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a2c0: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a2d0: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a2e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a2f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a300: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a310: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a320: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a330: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a340: 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20  pPCache)>0 );.  
a350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
a360: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
a370: 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e  ndif /* ifndef N
a380: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
a390: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f   SQLITE_DEBUG ./
a3a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
a3b0: 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e  inter to a human
a3c0: 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
a3d0: 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66   in a static buf
a3e0: 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  fer.** containin
a3f0: 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  g the state of t
a400: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
a410: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
a420: 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69  ument. This.** i
a430: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
a440: 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62   used within deb
a450: 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d  uggers. For exam
a460: 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72  ple, as an alter
a470: 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72  native.** to "pr
a480: 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20  int *pPager" in 
a490: 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29  gdb:.**.** (gdb)
a4a0: 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72   printf "%s", pr
a4b0: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
a4c0: 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69  pPager).*/.stati
a4d0: 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61  c char *print_pa
a4e0: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
a4f0: 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *p){.  static ch
a500: 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a  ar zRet[1024];..
a510: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a520: 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20  tf(1024, zRet,. 
a530: 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20       "Filename: 
a540: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
a550: 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20   "State:        
a560: 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e   %s errCode=%d\n
a570: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
a580: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
a590: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
a5a0: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
a5b0: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
a5c0: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
a5d0: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
a5e0: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
a5f0: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
a600: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
a610: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
a620: 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20    "Journal:     
a630: 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c    journalOff=%ll
a640: 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c  d journalHdr=%ll
a650: 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65  d\n".      "Size
a660: 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a  :          dbsiz
a670: 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d  e=%d dbOrigSize=
a680: 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64  %d dbFileSize=%d
a690: 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a  \n".      , p->z
a6a0: 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c  Filename.      ,
a6b0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a6c0: 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  R_OPEN          
a6d0: 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20    ? "OPEN" :.   
a6e0: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a6f0: 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20  PAGER_READER    
a700: 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22        ? "READER"
a710: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a720: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a730: 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57  ER_LOCKED   ? "W
a740: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a  RITER_LOCKED" :.
a750: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a760: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
a770: 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54  CACHEMOD ? "WRIT
a780: 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20  ER_CACHEMOD" :. 
a790: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a7a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
a7b0: 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45  BMOD    ? "WRITE
a7c0: 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20  R_DBMOD" :.     
a7d0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7e0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
a7f0: 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49  HED ? "WRITER_FI
a800: 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20  NISHED" :.      
a810: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
a820: 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20  ER_ERROR        
a830: 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22     ? "ERROR" : "
a840: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
a850: 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65   (int)p->errCode
a860: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63  .      , p->eLoc
a870: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20  k==NO_LOCK      
a880: 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a     ? "NO_LOCK" :
a890: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
a8a0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
a8b0: 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20     ? "RESERVED" 
a8c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
a8d0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a8e0: 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45  CK  ? "EXCLUSIVE
a8f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a900: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
a910: 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22  K     ? "SHARED"
a920: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a930: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
a940: 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22  K    ? "UNKNOWN"
a950: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
a960: 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76     , p->exclusiv
a970: 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69  eMode ? "exclusi
a980: 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20  ve" : "normal". 
a990: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
a9a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9b0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
a9c0: 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20    ? "memory" :. 
a9d0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
a9e0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9f0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
aa00: 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20    ? "off" :.    
aa10: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
aa20: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
aa30: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f  LMODE_DELETE   ?
aa40: 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20   "delete" :.    
aa50: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
aa60: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
aa70: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f  LMODE_PERSIST  ?
aa80: 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20   "persist" :.   
aa90: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
aaa0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
aab0: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
aac0: 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20  ? "truncate" :. 
aad0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
aae0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aaf0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
ab00: 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72    ? "wal" : "?er
ab10: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
ab20: 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20  nt)p->tempFile, 
ab30: 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28  (int)p->memDb, (
ab40: 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61  int)p->useJourna
ab50: 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  l.      , p->jou
ab60: 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72  rnalOff, p->jour
ab70: 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28  nalHdr.      , (
ab80: 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28  int)p->dbSize, (
ab90: 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a  int)p->dbOrigSiz
aba0: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c  e, (int)p->dbFil
abb0: 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65  eSize.  );..  re
abc0: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
abd0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
abe0: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
abf0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
ac00: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
ac10: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
ac20: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
ac30: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
ac40: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
ac50: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
ac60: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
ac70: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
ac80: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
ac90: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
aca0: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
acb0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
acc0: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
acd0: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
ace0: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
acf0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
ad00: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
ad10: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
ad20: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
ad30: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
ad40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
ad50: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
ad60: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e  Hdr *pPg){.  Pgn
ad70: 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
ad80: 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
ad90: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
ada0: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  r;.  int i;.  fo
adb0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
adc0: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
add0: 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
ade0: 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
adf0: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
ae00: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
ae10: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
ae20: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
ae30: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
ae40: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
ae50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
ae60: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
ae70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ae80: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
ae90: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
aea0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
aeb0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
aec0: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
aed0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
aee0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
aef0: 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67  ecTest(pPg->pPag
af00: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
af10: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f  pPg->pgno);.}../
af20: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
af30: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
af40: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
af50: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
af60: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
af70: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
af80: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
af90: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
afa0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
afb0: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
afc0: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
afd0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
afe0: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
aff0: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
b000: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
b010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
b020: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
b030: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
b040: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
b050: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
b060: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
b070: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
b080: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
b090: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
b0a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b0b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
b0c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
b0d0: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
b0e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b0f0: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
b100: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
b110: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
b120: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
b130: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
b140: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
b150: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
b160: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f  te((u8*)A,B).../
b170: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b180: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b190: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
b1a0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
b1b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
b1c0: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
b1d0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
b1e0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
b1f0: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
b200: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
b210: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
b220: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
b230: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
b240: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
b250: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
b260: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
b270: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
b280: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
b290: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
b2a0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
b2b0: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
b2c0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
b2d0: 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41  O_LOCK.** or SHA
b2e0: 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64  RED_LOCK. Regard
b2f0: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
b300: 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20  or not the call 
b310: 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  to xUnlock().** 
b320: 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68  succeeds, set th
b330: 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  e Pager.eLock va
b340: 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20  riable to match 
b350: 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20  the (attempted) 
b360: 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  new lock..**.** 
b370: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
b380: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
b390: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
b3a0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b3b0: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64   is.** called, d
b3c0: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e  o not modify it.
b3d0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b3e0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b3f0: 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57  ne of .** UNKNOW
b400: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
b410: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69  planation of thi
b420: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b430: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50   pagerUnlockDb(P
b440: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b450: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
b460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b470: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
b480: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
b490: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e || pPager->eLo
b4a0: 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61  ck==eLock );.  a
b4b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f  ssert( eLock==NO
b4c0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
b4d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
b4e0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d   assert( eLock!=
b4f0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72  NO_LOCK || pager
b500: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
b510: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
b520: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
b530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
b540: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ger->eLock>=eLoc
b550: 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  k );.    rc = sq
b560: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
b570: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
b580: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
b590: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
b5a0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
b5b0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
b5c0: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
b5d0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
b5e0: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
b5f0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
b600: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b610: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
b620: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
b630: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
b640: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
b650: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
b660: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
b670: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
b680: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
b690: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
b6a0: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
b6b0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
b6c0: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
b6d0: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
b6e0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b6f0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b700: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b710: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b720: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
b730: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
b740: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
b750: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
b760: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
b770: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
b780: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b790: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
b7a0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b7b0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
b7c0: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
b7d0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
b7e0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
b7f0: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
b800: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b810: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
b820: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b830: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
b840: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
b850: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
b860: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
b870: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
b880: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
b890: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
b8a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b8b0: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
b8c0: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
b8d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b8e0: 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d  E_OK && (pPager-
b8f0: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
b900: 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43  LOCK||eLock==EXC
b910: 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a  LUSIVE_LOCK) ){.
b920: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
b930: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
b940: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
b950: 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
b960: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
b970: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b980: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b990: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
b9a0: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
b9b0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
b9c0: 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
b9d0: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
b9e0: 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70  used with this p
b9f0: 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69  ager. The optimi
ba00: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
ba10: 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61  ed if:.**.**  (a
ba20: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
ba30: 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65  rned by OsDevice
ba40: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
ba50: 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  ) indicates that
ba60: 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62  .**      a datab
ba70: 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20  ase page may be 
ba80: 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
ba90: 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20  ly, and.**  (b) 
baa0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
bab0: 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69  ed by OsSectorSi
bac0: 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61  ze() is less tha
bad0: 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20  n or equal.**   
bae0: 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73     to the page s
baf0: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ize..**.** The o
bb00: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61  ptimization is a
bb10: 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c  lso always enabl
bb20: 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
bb30: 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a   files. It is.**
bb40: 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c   an error to cal
bb50: 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
bb60: 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65  if pPager is ope
bb70: 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d  ned on an in-mem
bb80: 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  ory.** database.
bb90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
bba0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
bbb0: 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20  t be used, 0 is 
bbc0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
bbd0: 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20  can be used,.** 
bbe0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
bbf0: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
bc00: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bc10: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a  al file when it.
bc20: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c  ** contains roll
bc30: 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78  back data for ex
bc40: 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a  actly one page..
bc50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
bc60: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
bc70: 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20  RITE.static int 
bc80: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
bc90: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bca0: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
bcb0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
bcc0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
bcd0: 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20    int dc;       
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68      /* Device ch
bd00: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
bd10: 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72  .    int nSector
bd20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bd30: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
bd40: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74   size */.    int
bd50: 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20   szPage;        
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd70: 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a  * Page size */..
bd80: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
bd90: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
bda0: 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74  ;.    dc = sqlit
bdb0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
bdc0: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
bdd0: 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74  ->fd);.    nSect
bde0: 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63  or = pPager->sec
bdf0: 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50  torSize;.    szP
be00: 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
be10: 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73  geSize;..    ass
be20: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
be30: 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
be40: 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72  >>8));.    asser
be50: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
be60: 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
be70: 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30  >>8));.    if( 0
be80: 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f  ==(dc&(SQLITE_IO
be90: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
bea0: 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74  ge>>8)) || nSect
beb0: 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20  or>szPage) ){.  
bec0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bed0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
bee0: 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  n JOURNAL_HDR_SZ
bef0: 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e  (pPager) + JOURN
bf00: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
bf10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
bf20: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
bf30: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
bf40: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
bf50: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
bf60: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
bf70: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
bf80: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
bf90: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
bfa0: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
bfb0: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
bfc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
bfd0: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
bfe0: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
bff0: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
c000: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
c010: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
c020: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
c030: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
c040: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
c050: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
c060: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
c070: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
c080: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
c090: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
c0a0: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
c0b0: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
c0c0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
c0d0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
c0e0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
c0f0: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
c100: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
c110: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
c120: 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61  r *)pPage->pData
c130: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
c140: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
c150: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c160: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65  ){.  pPage->page
c170: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
c180: 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a  ehash(pPage);.}.
c190: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
c1a0: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
c1b0: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
c1c0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
c1d0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c1e0: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
c1f0: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
c200: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
c210: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
c220: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
c230: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
c240: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
c250: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
c260: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
c270: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
c280: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
c290: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
c2a0: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
c2b0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
c2c0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
c2d0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
c2e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
c2f0: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
c300: 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  R );.  assert( (
c310: 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
c320: 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e  _DIRTY) || pPg->
c330: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
c340: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
c350: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
c360: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
c370: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
c380: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c390: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  X)  0.#define pa
c3a0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
c3b0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43  (X).#define CHEC
c3c0: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
c3d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
c3e0: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
c3f0: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
c400: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
c410: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
c420: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
c430: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
c440: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
c450: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
c460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c470: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
c480: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
c490: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
c4a0: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
c4b0: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
c4c0: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
c4d0: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
c4e0: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
c4f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
c500: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
c510: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
c520: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c530: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
c540: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
c550: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
c560: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
c570: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
c580: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
c590: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
c5a0: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
c5b0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
c5c0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
c5d0: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
c5e0: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
c5f0: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
c600: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
c610: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
c620: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
c630: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
c640: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
c650: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
c660: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
c670: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
c680: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
c690: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
c6a0: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
c6b0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
c6c0: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
c6d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
c6e0: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
c6f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c700: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
c710: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
c720: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
c730: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
c740: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
c750: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
c760: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
c770: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
c780: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
c790: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
c7a0: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
c7b0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
c7c0: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
c7d0: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
c7e0: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
c7f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c800: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
c810: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
c820: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
c830: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
c840: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
c850: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
c860: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
c870: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
c880: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
c890: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
c8a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c8b0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
c8c0: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
c8d0: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
c8e0: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
c8f0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
c920: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
c950: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
c960: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
c970: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
c980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
c990: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
c9a0: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
c9b0: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
c9c0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
c9d0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
c9e0: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
c9f0: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
ca00: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca20: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
ca30: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
ca40: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
ca50: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
ca60: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
ca70: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
ca80: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
ca90: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
caa0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cab0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
cac0: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
cad0: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
cae0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
caf0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
cb00: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
cb10: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
cb20: 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49  ster .   || SQLI
cb30: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
cb40: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
cb50: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
cb60: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
cb70: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
cb80: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
cb90: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
cba0: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
cbb0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
cbc0: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
cbd0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cbe0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
cbf0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
cc00: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
cc10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
cc20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
cc30: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
cc40: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
cc50: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cc60: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
cc70: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
cc80: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
cc90: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
cca0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
ccb0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
ccc0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
ccd0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
cce0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
ccf0: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
cd00: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
cd10: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
cd20: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
cd30: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
cd40: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
cd50: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
cd60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
cd70: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
cd80: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
cd90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
cda0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
cdb0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
cdc0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
cdd0: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
cde0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cdf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
ce00: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
ce10: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
ce20: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
ce30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
ce40: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
ce50: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
ce60: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
ce70: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
ce80: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
ce90: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
cea0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
ceb0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
cec0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
ced0: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
cee0: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf10: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
cf80: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
cf90: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
cfa0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
cfb0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
cfc0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
cfd0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
cfe0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
cff0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d000: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d010: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d020: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
d030: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d040: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d050: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d060: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d070: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d080: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d090: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d0a0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d0b0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d0c0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d0d0: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d0e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d0f0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d100: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d110: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d120: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d130: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d140: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d150: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d160: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d170: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d180: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d190: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d1a0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d1b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d1c0: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d1d0: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d1e0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d1f0: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d200: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d210: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d220: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d230: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d240: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d250: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d260: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d270: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d280: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d290: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d2a0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d2b0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d2c0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d2d0: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d2e0: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d2f0: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d300: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d310: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d320: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d330: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
d340: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
d350: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d360: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
d370: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
d380: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
d390: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
d3a0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
d3b0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
d3c0: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
d3d0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
d3e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d3f0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d400: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
d410: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
d420: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
d430: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
d440: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
d450: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
d460: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
d470: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
d480: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
d490: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
d4a0: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
d4b0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
d4c0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
d4d0: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
d4e0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
d4f0: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
d500: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d510: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
d540: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
d550: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
d560: 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
d570: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d580: 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  f ){.    const i
d590: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
d5a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
d5b0: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  imit;    /* Loca
d5c0: 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a  l cache of jsl *
d5d0: 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  /..    IOTRACE((
d5e0: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
d5f0: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
d600: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
d610: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
d620: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d630: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
d640: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
d650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74  else{.      stat
d660: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
d670: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
d680: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d690: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
d6a0: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
d6b0: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
d6c0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
d6d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d6e0: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
d6f0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
d700: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
d710: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
d720: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
d730: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  LY|pPager->syncF
d740: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
d750: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
d760: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
d770: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
d780: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
d790: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
d7a0: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
d7b0: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
d7c0: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
d7d0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
d7e0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
d7f0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
d800: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d810: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
d820: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
d830: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
d840: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
d850: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
d860: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
d870: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
d880: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
d890: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
d8a0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
d8b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d8c0: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
d8d0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
d8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d8f0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
d900: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
d910: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
d920: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
d930: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
d940: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
d950: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
d960: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
d970: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d990: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
d9a0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
d9b0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
d9c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
d9d0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
d9e0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
d9f0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
da00: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
da10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
da20: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
da30: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
da40: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
da50: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
da60: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
da70: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
da80: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
da90: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
daa0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
dab0: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
dac0: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
dad0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
dae0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
daf0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
db00: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
db10: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
db20: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
db30: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
db40: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
db50: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
db60: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
db70: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
db80: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
db90: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
dba0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
dbb0: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
dbc0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
dbd0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
dbe0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
dbf0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
dc00: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
dc10: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
dc20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc40: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
dc50: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
dc60: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
dc70: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
dc80: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
dc90: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
dca0: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
dcb0: 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61   (u32)pPager->pa
dcc0: 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f  geSize;/* Size o
dcd0: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
dce0: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
dcf0: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
dd20: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
dd30: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
dd40: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
dd70: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
dd80: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
dd90: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
dda0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
ddb0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
ddc0: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
ddd0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dde0: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
ddf0: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
de00: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
de10: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
de20: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
de30: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
de40: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
de50: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
de60: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
de70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
de80: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
de90: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
dea0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
deb0: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
dec0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
ded0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
dee0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
def0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
df00: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
df10: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
df20: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
df30: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
df40: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
df50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
df60: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
df70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
df80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
df90: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
dfa0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
dfb0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
dfc0: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
dfd0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
dfe0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
dff0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
e000: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e010: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
e020: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
e030: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
e040: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
e050: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
e060: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
e070: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
e080: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
e090: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
e0a0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
e0b0: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
e0c0: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
e0d0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
e0e0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
e0f0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
e100: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
e110: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
e120: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
e130: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
e140: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
e150: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
e160: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
e170: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
e180: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
e190: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
e1a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e1b0: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
e1c0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
e1d0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
e1e0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
e1f0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
e200: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
e210: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
e220: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
e230: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
e240: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
e250: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
e260: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
e270: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
e280: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
e290: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
e2a0: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
e2b0: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
e2c0: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
e2d0: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
e2e0: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
e2f0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
e300: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
e310: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
e320: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
e330: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
e340: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
e350: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
e360: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
e370: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
e380: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e390: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
e3a0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e3b0: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
e3c0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
e3d0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
e3e0: 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  c || (pPager->jo
e3f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
e400: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
e410: 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69  ORY).   || (sqli
e420: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
e430: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
e440: 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
e450: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
e460: 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70   .  ){.    memcp
e470: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
e480: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
e490: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
e4a0: 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
e4b0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e4c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
e4d0: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
e4e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
e4f0: 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69  t(zHeader, 0, si
e500: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e510: 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ic)+4);.  }..  /
e520: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
e530: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
e540: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
e550: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
e560: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
e570: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
e580: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
e590: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e5a0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e5b0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
e5c0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
e5d0: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
e5e0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
e5f0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
e600: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
e610: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
e620: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
e630: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
e640: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
e650: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
e660: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
e670: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e680: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e690: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
e6a0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
e6b0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
e6c0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e6d0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e6e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
e6f0: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
e700: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
e710: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
e720: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
e730: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
e740: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
e750: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
e760: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
e770: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
e780: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
e790: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
e7a0: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
e7b0: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
e7c0: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
e7d0: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
e7e0: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
e7f0: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
e800: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
e810: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e820: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
e830: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
e840: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
e850: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
e860: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
e870: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
e880: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
e890: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
e8a0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
e8b0: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
e8c0: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
e8d0: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
e8e0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
e8f0: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
e900: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
e910: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
e920: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
e930: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
e940: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
e950: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
e960: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
e970: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
e980: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
e990: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
e9a0: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
e9b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
e9c0: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
e9d0: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
e9e0: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
e9f0: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
ea00: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
ea10: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
ea20: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
ea30: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
ea40: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
ea50: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
ea60: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
ea70: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
ea80: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
ea90: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
eaa0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
eab0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
eac0: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
ead0: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
eae0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
eaf0: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
eb00: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
eb10: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
eb20: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
eb30: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
eb40: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
eb50: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
eb60: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
eb70: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
eb80: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
eb90: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
eba0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
ebb0: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
ebc0: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
ebd0: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
ebe0: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
ebf0: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
ec00: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
ec10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
ec20: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
ec30: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
ec40: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
ec50: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
ec60: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
ec70: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
ec80: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
ec90: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
eca0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ecb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
ecc0: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
ecd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ece0: 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  f);.    assert( 
ecf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
ed00: 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
ed10: 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
ed20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ed30: 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20  ff += nHeader;. 
ed40: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
ed50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
ed60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
ed70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
ed80: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
ed90: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
eda0: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
edb0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
edc0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
edd0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
ede0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
edf0: 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65   file. The curre
ee00: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
ee10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ee20: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  is given by.** p
ee30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ee40: 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  f. See comments 
ee50: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
ee60: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
ee70: 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69   for.** a descri
ee80: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  ption of the jou
ee90: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
eea0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
eeb0: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
eec0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70  successfully, *p
eed0: 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  NRec is set to t
eee0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
eef0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
ef00: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
ef10: 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20  er and *pDbSize 
ef20: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
ef30: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
ef40: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
ef50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
ef60: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
ef70: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
ef80: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
ef90: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
efa0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
efb0: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
efc0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
efd0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
efe0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
eff0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f000: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
f010: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
f020: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
f030: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65  turned and *pNRe
f040: 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61  c and *PDbSize a
f050: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49  re undefined.  I
f060: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
f070: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
f080: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
f090: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
f0a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
f0b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
f0c0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
f0d0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
f0e0: 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
f0f0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
f100: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
f110: 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75  isHot,.  i64 jou
f120: 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20  rnalSize,       
f130: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f140: 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
f150: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
f160: 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  */.  u32 *pNRec,
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
f190: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52  read from the nR
f1a0: 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33  ec field */.  u3
f1b0: 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20  2 *pDbSize      
f1c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
f1d0: 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67  T: Value of orig
f1e0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  inal database si
f1f0: 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  ze field */.){. 
f200: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f220: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
f230: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
f240: 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f  aMagic[8];     /
f250: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
f260: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
f270: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  der */.  i64 iHd
f280: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
f290: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
f2a0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
f2b0: 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a  r being read */.
f2c0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
f2d0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
f2e0: 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  ;      /* Journa
f2f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f300: 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64  pen. */..  /* Ad
f310: 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72  vance Pager.jour
f320: 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74  nalOff to the st
f330: 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
f340: 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20  sector. If the. 
f350: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
f360: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f   is too small fo
f370: 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20  r there to be a 
f380: 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74  header stored at
f390: 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74   this.  ** point
f3a0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
f3b0: 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  DONE..  */.  pPa
f3c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f3d0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
f3e0: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
f3f0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f400: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
f410: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
f420: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
f430: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f440: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  ONE;.  }.  iHdrO
f450: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
f460: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52  rnalOff;..  /* R
f470: 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  ead in the first
f480: 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   8 bytes of the 
f490: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
f4a0: 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  If they do not m
f4b0: 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d  atch.  ** the  m
f4c0: 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e  agic string foun
f4d0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
f4e0: 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68  f each journal h
f4f0: 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20  eader, return.  
f500: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  ** SQLITE_DONE. 
f510: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
f520: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
f530: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
f540: 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f  erwise,.  ** pro
f550: 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ceed..  */.  if(
f560: 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66   isHot || iHdrOf
f570: 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f!=pPager->journ
f580: 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20  alHdr ){.    rc 
f590: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
f5a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
f5b0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
f5c0: 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20  ic), iHdrOff);. 
f5d0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f5e0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f5f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63    }.    if( memc
f600: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
f610: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
f620: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
f630: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f640: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
f650: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
f660: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33  he first three 3
f670: 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20  2-bit fields of 
f680: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f690: 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a  er: The nRec.  *
f6a0: 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65  * field, the che
f6b0: 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65  cksum-initialize
f6c0: 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  r and the databa
f6d0: 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73  se size at the s
f6e0: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
f6f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65   transaction. Re
f700: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
f710: 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
f720: 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a  oes wrong..  */.
f730: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f740: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
f750: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
f760: 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29  HdrOff+8, pNRec)
f770: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
f780: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f790: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
f7a0: 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50   iHdrOff+12, &pP
f7b0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
f7c0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
f7d0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f7e0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
f7f0: 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62   iHdrOff+16, pDb
f800: 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Size)).  ){.    
f810: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
f820: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
f830: 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
f840: 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65     u32 iPageSize
f850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f860: 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65  /* Page-size fie
f870: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
f880: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  ader */.    u32 
f890: 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20  iSectorSize;    
f8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
f8b0: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  or-size field of
f8c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f8d0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  */..    /* Read 
f8e0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
f8f0: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f  d sector-size jo
f900: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65  urnal header fie
f910: 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  lds. */.    if( 
f920: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f930: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f940: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f950: 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a  +20, &iSectorSiz
f960: 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49  e)).     || SQLI
f970: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f980: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f990: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c  jfd, iHdrOff+24,
f9a0: 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20   &iPageSize)).  
f9b0: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
f9c0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
f9d0: 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20   /* Versions of 
f9e0: 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20  SQLite prior to 
f9f0: 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61  3.5.8 set the pa
fa00: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
fa10: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
fa20: 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65  nal header to ze
fa30: 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
fa40: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
fa50: 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  e Pager.pageSize
fa60: 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
fa70: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
fa80: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  to the correct p
fa90: 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  age size..    */
faa0: 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
fab0: 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
fac0: 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
fad0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
fae0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
faf0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
fb00: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
fb10: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
fb20: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
fb30: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
fb40: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
fb50: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
fb60: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
fb70: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
fb80: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
fb90: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
fba0: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
fbb0: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
fbc0: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
fbd0: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
fbe0: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
fbf0: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
fc00: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
fc10: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
fc20: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
fc30: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
fc40: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
fc50: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
fc60: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
fc70: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
fc80: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
fc90: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
fca0: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
fcb0: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
fcc0: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
fcd0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
fce0: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
fcf0: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
fd00: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
fd10: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
fd20: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
fd30: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
fd40: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
fd50: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
fd60: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
fd70: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
fd80: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
fd90: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
fda0: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
fdb0: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
fdc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
fdd0: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
fde0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fdf0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
fe00: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
fe10: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
fe20: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
fe30: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
fe40: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
fe50: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
fe60: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
fe70: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
fe80: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
fe90: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
fea0: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
feb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
fec0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fed0: 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
fee0: 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29   &iPageSize, -1)
fef0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ff00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
ff10: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
ff20: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
ff30: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
ff40: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
ff50: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
ff60: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
ff70: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
ff80: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
ff90: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
ffa0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
ffb0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
ffc0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
ffd0: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
ffe0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
fff0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
10000 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
10010 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
10020 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
10030 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
10040 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
10050 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
10060 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
10070 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
10080 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
10090 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
100a0 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
100b0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
100c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
100d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
100e0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
100f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10100 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
10110 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
10120 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
10130 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
10140 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
10150 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
10160 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
10170 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
10180 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
10190 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
101a0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
101b0 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
101c0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
101d0 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
101e0 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
101f0 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
10200 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
10210 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
10220 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
10230 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
10240 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
10250 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
10260 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
10270 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
10280 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
10290 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
102a0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
102b0 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
102c0 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
102d0 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
102e0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
102f0 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
10300 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
10310 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
10320 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10330 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
10340 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
10350 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
10360 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
10370 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
10380 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
10390 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
103a0 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
103b0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
103c0 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
103d0 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
103e0 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
103f0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
10400 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
10410 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10420 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
10430 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
10440 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
10450 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
10460 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10490 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
104a0 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
104b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
104c0 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
104d0 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
104e0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
104f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10500 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
10510 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
10520 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
10530 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10540 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
10560 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
10570 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
10580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10590 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
105a0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
105b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
105c0 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
105d0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
105e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
105f0 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
10600 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  r .   || pPager-
10610 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10620 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10630 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
10640 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
10650 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
10660 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
10670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10680 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
10690 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
106a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
106b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
106c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
106d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
106e0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
106f0 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
10700 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
10710 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10720 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10730 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10740 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
10750 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
10760 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
10770 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
10780 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
10790 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
107a0 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
107b0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
107c0 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
107d0 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
107e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
107f0 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
10800 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
10810 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
10820 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
10830 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
10840 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
10850 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
10860 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
10870 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10880 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
10890 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
108a0 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
108b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
108c0 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
108d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
108e0 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
108f0 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
10900 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
10910 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10920 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
10930 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
10940 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
10950 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
10960 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
10970 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
10980 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
10990 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
109a0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
109b0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
109c0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
109d0 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
109e0 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
109f0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10a00 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10a10 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
10a20 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
10a30 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10a40 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
10a50 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10a60 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
10a70 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
10a80 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
10a90 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
10aa0 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
10ab0 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
10ac0 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
10ad0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10ae0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10af0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
10b00 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f  Master+20);..  /
10b10 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
10b20 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
10b30 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
10b40 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
10b50 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
10b60 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
10b70 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10b80 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10b90 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
10ba0 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
10bb0 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
10bc0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
10bd0 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
10be0 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
10bf0 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
10c00 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
10c10 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
10c20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
10c30 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
10c40 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
10c50 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
10c60 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
10c70 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
10c80 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
10c90 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
10ca0 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
10cb0 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
10cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
10cd0 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
10ce0 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
10cf0 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
10d00 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
10d10 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
10d20 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
10d30 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
10d40 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
10d50 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
10d60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
10d70 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
10d80 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
10d90 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
10da0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10db0 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
10dc0 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
10dd0 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
10de0 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a   number. Return.
10df0 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
10e00 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
10e10 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
10e20 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a  d page is not .*
10e30 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d  * already in mem
10e40 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ory..*/.static P
10e50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
10e60 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
10e70 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
10e80 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ea0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
10eb0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
10ec0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
10ed0 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63  r a call to Pcac
10ee0 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63  heFetch() with c
10ef0 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a  reateFlag==0 to.
10f00 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65    ** fail, since
10f10 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   no attempt to a
10f20 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20  llocate dynamic 
10f30 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d  memory will be m
10f40 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  ade..  */.  (voi
10f50 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
10f60 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
10f70 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
10f80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  p);.  return p;.
10f90 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
10fa0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
10fb0 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
10fc0 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
10fd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10fe0 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
10ff0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
11000 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
11010 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
11020 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
11030 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
11040 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
11050 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73  /*.** Free all s
11060 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
11070 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
11080 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65  t[] array and se
11090 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e  t both.** Pager.
110a0 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50  aSavepoint and P
110b0 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20  ager.nSavepoint 
110c0 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74  to zero. Close t
110d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
110e0 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20  * if it is open 
110f0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
11100 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
11110 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e mode..*/.stati
11120 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c  c void releaseAl
11130 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65  lSavepoints(Page
11140 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
11150 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
11160 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
11170 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  for looping thro
11180 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70  ugh Pager.aSavep
11190 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69  oint */.  for(ii
111a0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
111b0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
111c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
111d0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
111e0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
111f0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
11200 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
11210 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11220 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65  e || sqlite3IsMe
11230 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
11240 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71  >sjfd) ){.    sq
11250 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
11260 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a  ger->sjfd);.  }.
11270 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11280 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11290 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53  t);.  pPager->aS
112a0 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
112b0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
112c0 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
112d0 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d  ->nSubRec = 0;.}
112e0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
112f0 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  bit number pgno 
11300 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65  in the PagerSave
11310 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
11320 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f  nt .** bitvecs o
11330 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  f all open savep
11340 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51  oints. Return SQ
11350 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
11360 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49  ssful.** or SQLI
11370 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
11380 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
11390 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
113a0 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  nt addToSavepoin
113b0 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a  tBitvecs(Pager *
113c0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
113d0 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  o){.  int ii;   
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
11400 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
11410 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
11420 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
11430 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
11440 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
11450 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
11460 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
11470 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
11480 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  vepoint[ii];.   
11490 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f   if( pgno<=p->nO
114a0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
114b0 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  |= sqlite3Bitvec
114c0 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  Set(p->pInSavepo
114d0 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  int, pgno);.    
114e0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
114f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
11500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
11510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
11520 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11530 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
11540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11550 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11560 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
11570 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
11580 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
11590 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
115a0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
115b0 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
115c0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
115d0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
115e0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
115f0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
11600 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
11610 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
11620 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
11630 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
11640 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
11650 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
11660 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
11670 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
11680 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
11690 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
116a0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
116b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
116c0 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
116d0 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
116e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
116f0 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
11700 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11710 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
11720 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
11730 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11740 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
11750 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
11760 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
11770 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
11780 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
11790 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
117a0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
117b0 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
117c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
117d0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
117e0 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
117f0 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
11800 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
11810 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
11820 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
11830 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
11840 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
11850 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
11860 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
11870 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11880 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
11890 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
118a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
118b0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
118c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
118d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
118e0 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
118f0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11900 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
11910 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69   );..  sqlite3Bi
11920 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11930 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
11940 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
11950 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  urnal = 0;.  rel
11960 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11970 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  s(pPager);..  if
11980 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
11990 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
119a0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
119b0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
119c0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
119d0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
119e0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
119f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
11a00 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
11a10 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
11a20 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11a30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20   ){.    int rc; 
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
11a60 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  ode returned by 
11a70 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20  pagerUnlockDb() 
11a80 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d  */.    int iDc =
11a90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
11aa0 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76  fd)?sqlite3OsDev
11ab0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
11ac0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30  cs(pPager->fd):0
11ad0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
11ae0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
11af0 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69  m support deleti
11b00 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73  on of open files
11b10 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c  , then.    ** cl
11b20 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
11b30 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69  file when droppi
11b40 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
11b50 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65  lock.  Otherwise
11b60 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20  .    ** another 
11b70 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
11b80 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c  journal_mode=del
11b90 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65  ete might delete
11ba0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11bb0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
11bc0 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  us..    */.    a
11bd0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11be0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
11bf0 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
11c00 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11c10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
11c20 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
11c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11c40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11c50 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31  WAL      & 5)!=1
11c60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11c70 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11c80 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29  DE_DELETE   & 5)
11c90 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11ca0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11cb0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26  LMODE_TRUNCATE &
11cc0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)==1 );.    as
11cd0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11ce0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
11cf0 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20    & 5)==1 );.   
11d00 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53   if( 0==(iDc & S
11d10 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
11d20 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11d30 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70  N).     || 1!=(p
11d40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
11d50 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20  de & 5).    ){. 
11d60 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11d70 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
11d80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11d90 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11da0 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
11db0 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20  te and the call 
11dc0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
11dd0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
11de0 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68  le fails, set th
11df0 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74  e current lock t
11e00 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20  o UNKNOWN_LOCK. 
11e10 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a  See the comment.
11e20 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65      ** above the
11e30 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b   #define for UNK
11e40 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
11e50 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
11e60 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  why this.    ** 
11e70 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
11e80 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
11e90 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
11ea0 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  er, NO_LOCK);.  
11eb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11ec0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65  _OK && pPager->e
11ed0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
11ee0 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OR ){.      pPag
11ef0 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e  er->eLock = UNKN
11f00 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  OWN_LOCK;.    }.
11f10 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
11f20 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63  r state may be c
11f30 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45  hanged from PAGE
11f40 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52  R_ERROR to PAGER
11f50 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a  _OPEN here.    *
11f60 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69  * without cleari
11f70 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ng the error cod
11f80 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e  e. This is inten
11f90 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72  tional - the err
11fa0 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69  or.    ** code i
11fb0 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68  s cleared and th
11fc0 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e  e cache reset in
11fd0 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77   the block below
11fe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
11ff0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
12000 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Code || pPager->
12010 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
12020 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ROR );.    pPage
12030 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12040 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
12050 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12060 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20  ER_OPEN;.  }..  
12070 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43  /* If Pager.errC
12080 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20  ode is set, the 
12090 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
120a0 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e  pager cache cann
120b0 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74  ot be.  ** trust
120c0 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
120d0 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
120e0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
120f0 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20   to the pager,. 
12100 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c   ** it can safel
12110 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50  y move back to P
12120 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e  AGER_OPEN state.
12130 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
12140 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61   both.  ** norma
12150 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d  l and exclusive-
12160 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20  locking mode..  
12170 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
12180 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
12190 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
121a0 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
121b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
121c0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
121d0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
121e0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70  >tempFile;.    p
121f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12200 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
12210 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12220 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
12230 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12240 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
12250 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12260 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12270 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d  setMaster = 0;.}
12280 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12290 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
122a0 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52  whenever an IOER
122b0 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20  R or FULL error 
122c0 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a  that requires.**
122d0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72   the pager to tr
122e0 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ansition into th
122f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61  e ERROR state ma
12300 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e  y ahve occurred.
12310 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
12320 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
12330 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
12340 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
12350 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65  second .** the e
12360 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
12370 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
12380 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
12390 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20  nction. The .** 
123a0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
123b0 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
123c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
123d0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
123e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
123f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12400 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  is SQLITE_FULL, 
12410 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
12420 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f  one of the.** IO
12430 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74  ERR sub-codes, t
12440 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20  he pager enters 
12450 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
12460 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
12470 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  de.** is stored 
12480 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  in Pager.errCode
12490 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  . While the page
124a0 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65  r remains in the
124b0 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a   ERROR state,.**
124c0 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63   all major API c
124d0 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65  alls on the Page
124e0 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
124f0 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e  ly return Pager.
12500 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  errCode..**.** T
12510 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
12520 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
12530 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12540 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
12550 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
12560 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
12570 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
12580 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
12590 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
125a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
125b0 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
125c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
125d0 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
125e0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
125f0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
12600 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
12610 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
12620 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
12630 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
12640 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12660 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
12670 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
12680 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
12690 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
126a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
126b0 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
126c0 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
126d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
126e0 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
126f0 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
12700 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12710 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
12720 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
12730 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12740 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
12750 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12760 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
12770 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
12780 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
12790 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45  L || rc2==SQLITE
127a0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50  _IOERR ){.    pP
127b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
127c0 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
127d0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  eState = PAGER_E
127e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
127f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
12810 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
12820 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
12830 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
12840 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
12850 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
12860 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
12870 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
12880 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
12890 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
128a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
128b0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
128c0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
128d0 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
128e0 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
128f0 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
12900 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
12910 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
12920 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
12930 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12940 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
12950 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f  ed in PAGER_ERRO
12960 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69  R state. If it i
12970 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50  s called.** in P
12980 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47  AGER_NONE or PAG
12990 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
129a0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  and the lock hel
129b0 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63  d is less.** exc
129c0 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45  lusive than a RE
129d0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20  SERVED lock, it 
129e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
129f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
12a00 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
12a10 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
12a20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
12a30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
12a40 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
12a50 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
12a60 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
12a70 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
12a80 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
12a90 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
12aa0 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
12ab0 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
12ac0 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
12ad0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
12ae0 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
12af0 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
12b00 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
12b10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
12b20 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
12b30 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12b40 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
12b50 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
12b60 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
12b70 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
12b80 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
12b90 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
12ba0 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
12bb0 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
12bc0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
12bd0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12be0 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
12bf0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
12c00 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
12c10 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
12c20 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
12c30 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
12c40 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
12c50 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
12c60 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
12c70 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
12c80 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
12c90 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
12ca0 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12cb0 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
12cc0 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
12cd0 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
12ce0 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
12cf0 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
12d00 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
12d10 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
12d20 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
12d30 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
12d40 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
12d50 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
12d60 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
12d70 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
12d80 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
12d90 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
12da0 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
12db0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
12dc0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
12dd0 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
12de0 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
12df0 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
12e00 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e10 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12e20 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
12e30 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
12e40 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
12e50 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
12e60 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
12e70 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
12e80 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
12e90 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
12ea0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
12eb0 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
12ec0 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
12ed0 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
12ee0 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
12ef0 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
12f00 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
12f10 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
12f20 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65  , the pager move
12f30 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  s to PAGER_READE
12f40 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72  R state..** If r
12f50 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
12f60 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b  clusive rollback
12f70 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
12f80 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a  on the file is .
12f90 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
12fa0 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a   a SHARED_LOCK..
12fb0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
12fc0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
12fd0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
12fe0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12ff0 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
13000 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
13010 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
13020 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13030 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
13040 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
13050 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
13060 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
13070 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
13080 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
13090 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
130a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
130b0 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
130c0 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
130d0 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
130e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
130f0 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
13100 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
13110 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
13120 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
13130 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
13140 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
13150 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
13160 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
13170 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
13180 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
13190 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
131a0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
131b0 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
131c0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
131d0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
131e0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
131f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13200 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13210 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
13220 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
13230 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
13240 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
13250 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13260 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
13270 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13280 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
13290 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
132a0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
132b0 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
132c0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
132d0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
132e0 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
132f0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
13300 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
13310 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
13320 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
13330 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
13340 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
13350 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
13360 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
13370 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
13380 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
13390 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
133a0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
133b0 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
133c0 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
133d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
133e0 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
133f0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
13400 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
13410 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
13420 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
13430 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
13440 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
13450 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
13460 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
13470 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
13480 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
13490 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
134a0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
134b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
134c0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
134d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
134e0 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
134f0 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
13500 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
13510 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
13520 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
13530 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
13540 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
13550 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
13560 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
13570 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
13580 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
13590 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
135a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
135b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
135c0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
135d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
135e0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
135f0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
13600 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
13610 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13620 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
13630 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
13640 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
13650 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
13660 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
13670 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13680 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
13690 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
136a0 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
136b0 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
136c0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
136d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
136e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
136f0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
13700 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
13710 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
13720 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13730 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
13740 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
13750 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13760 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
13770 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
13780 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13790 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
137a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
137b0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
137c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
137d0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
137e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
137f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13810 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
13820 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
13830 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13840 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
13850 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70  SIST.      || (p
13860 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13870 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
13880 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
13890 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
138a0 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  AL).    ){.     
138b0 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
138c0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
138d0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
138e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
138f0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
13900 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
13910 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
13920 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
13930 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
13940 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
13950 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
13960 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
13970 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
13980 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
13990 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
139a0 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
139b0 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
139c0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
139d0 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
139e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
139f0 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
13a00 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
13a10 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  mory journal. . 
13a20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
13a30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13a40 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13a50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
13a60 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
13a70 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
13a80 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13a90 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
13aa0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13ab0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13ac0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13ad0 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
13ae0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
13af0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13b00 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
13b10 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
13b20 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
13b30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13b40 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
13b50 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
13b60 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
13b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
13b80 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13b90 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
13ba0 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
13bb0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13bc0 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
13bd0 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
13be0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
13bf0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
13c00 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
13c10 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
13c20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61 67    PgHdr *p = pag
13c30 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
13c40 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 1);.    if( p 
13c50 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65  ){.      p->page
13c60 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
13c70 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
13c80 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  f(p);.    }.  }.
13c90 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
13ca0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
13cb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13cc0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
13cd0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
13ce0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
13cf0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13d00 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
13d10 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
13d20 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
13d30 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
13d40 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
13d50 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
13d60 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13d70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
13d80 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
13d90 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
13da0 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
13db0 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
13dc0 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
13dd0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
13de0 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
13df0 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
13e00 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
13e10 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
13e20 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
13e30 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
13e40 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
13e50 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
13e60 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
13e70 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
13e80 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
13e90 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
13ea0 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
13eb0 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  (!pagerUseWal(pP
13ec0 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33  ager) || sqlite3
13ed0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
13ee0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30  (pPager->pWal, 0
13ef0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20  )).  ){.    rc2 
13f00 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
13f10 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
13f20 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
13f30 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
13f40 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  e = 0;.  }.  pPa
13f50 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
13f60 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50  GER_READER;.  pP
13f70 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
13f80 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28  = 0;..  return (
13f90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
13fa0 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
13fb0 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
13fc0 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
13fd0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
13fe0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
13ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14000 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14010 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
14020 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
14030 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  R state, do not 
14040 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
14050 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
14060 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
14070 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
14080 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
14090 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
140a0 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
140b0 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
140c0 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
140d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
140e0 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74   file and move t
140f0 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f  he pager back to
14100 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20   OPEN state. If 
14110 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74  this .** means t
14120 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 68  hat there is a h
14130 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ot-journal left 
14140 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
14150 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a  em, the next .**
14160 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f   connection to o
14170 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
14180 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72  ock on the pager
14190 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74   (which may be t
141a0 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c  his one) .** wil
141b0 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  l roll it back..
141c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
141d0 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  er has not alrea
141e0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
141f0 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
14200 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c  an IO or.** mall
14210 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
14220 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
14230 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c  k, then this wil
14240 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a  l itself cause .
14250 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
14260 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
14270 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c  state. Which wil
14280 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  l be cleared by 
14290 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  the.** call to p
142a0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61  ager_unlock(), a
142b0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
142c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
142d0 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
142e0 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
142f0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
14300 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
14310 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50  AGER_ERROR && pP
14320 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
14330 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
14340 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
14350 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
14360 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  r) );.    if( pP
14370 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
14380 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
14390 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
143a0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
143b0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  loc();.      sql
143c0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
143d0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
143e0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
143f0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d  nMalloc();.    }
14400 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
14410 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14420 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14430 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
14440 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
14450 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64  .      pager_end
14460 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
14470 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
14480 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
14490 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
144a0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
144b0 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
144c0 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
144d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
144e0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
144f0 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
14500 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
14510 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
14520 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
14530 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
14540 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
14550 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
14560 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
14570 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
14580 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
14590 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
145a0 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
145b0 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
145c0 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
145d0 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
145e0 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
145f0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
14600 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
14610 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
14620 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14630 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
14640 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
14650 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
14660 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
14670 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
14680 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
14690 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
146a0 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
146b0 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
146c0 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
146d0 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
146e0 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
146f0 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
14700 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
14710 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
14720 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
14730 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
14740 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
14750 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
14760 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
14770 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
14780 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
14790 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
147a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
147b0 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
147c0 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
147d0 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
147e0 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
147f0 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
14800 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
14810 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
14820 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
14830 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
14840 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
14850 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
14860 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
14870 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
14880 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
14890 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
148a0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
148b0 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
148c0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
148d0 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
148e0 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
148f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
14900 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
14910 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
14920 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
14930 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
14940 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
14950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
14960 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
14970 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
14980 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
14990 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
149a0 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
149b0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
149c0 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
149d0 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
149e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
149f0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
14a00 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
14a10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
14a20 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
14a30 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
14a40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
14a70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
14a80 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
14a90 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
14aa0 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
14ab0 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
14ac0 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
14ad0 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  dec */.#endif../
14ae0 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
14af0 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
14b00 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
14b10 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
14b20 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
14b30 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
14b40 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
14b50 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
14b60 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
14b70 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
14b80 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
14b90 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
14ba0 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
14bb0 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
14bc0 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
14bd0 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
14be0 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
14bf0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  al..**.** The ma
14c00 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
14c10 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75  nal uses checksu
14c20 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
14c30 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
14c40 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  .** not..**.** I
14c50 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
14c60 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
14c70 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
14c80 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
14c90 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
14ca0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
14cb0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
14cc0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
14cd0 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
14ce0 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
14cf0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14d00 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
14d10 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
14d20 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
14d30 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
14d40 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
14d50 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
14d60 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
14d70 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
14d80 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
14d90 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
14da0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
14db0 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
14dc0 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
14dd0 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
14de0 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
14df0 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
14e00 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
14e10 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
14e20 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
14e30 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
14e40 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
14e50 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
14e60 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14e70 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14e80 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
14e90 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
14ea0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
14eb0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
14ec0 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
14ed0 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
14ee0 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
14ef0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
14f00 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
14f10 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
14f20 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
14f30 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
14f40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
14f50 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
14f60 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
14f70 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
14f80 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
14f90 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
14fa0 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
14fb0 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
14fc0 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
14fd0 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
14fe0 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
14ff0 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
15000 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
15010 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
15020 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
15030 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
15040 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
15050 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
15060 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
15070 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15080 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
15090 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
150a0 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
150b0 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
150c0 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
150d0 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
150e0 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
150f0 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
15100 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15110 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
15120 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
15130 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
15140 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
15150 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
15160 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
15170 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
15180 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
15190 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
151a0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
151b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
151c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
151d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
151e0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
151f0 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
15200 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
15210 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
15220 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
15230 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  ack */.  i64 *pO
15240 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
15250 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
15260 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
15270 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  ayback */.  Bitv
15280 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20  ec *pDone,      
15290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
152a0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
152b0 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
152c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
152d0 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
152e0 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
152f0 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
15300 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
15310 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20   int isSavepnt  
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15330 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76  * True for a sav
15340 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15350 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
15360 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
15390 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
153a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
153d0 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
153e0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
153f0 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15410 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
15420 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
15430 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ing */.  char *a
15440 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
15450 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
15460 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
15470 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
15480 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
15490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
154a0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
154b0 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
154c0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
154d0 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20   isSynced;      
154e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
154f0 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61  ue if journal pa
15500 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  ge is synced */.
15510 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
15520 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
15530 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
15540 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
15550 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
15560 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
15570 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
15580 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
15590 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
155a0 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
155b0 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
155c0 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
155d0 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
155e0 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
155f0 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
15600 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
15610 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
15620 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
15630 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
15640 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
15650 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
15660 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
15670 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
15680 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
15690 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
156a0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
156b0 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
156c0 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
156d0 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  epnt) );..  /* E
156e0 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20  ither the state 
156f0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
15700 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15710 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63  HEMOD (a transac
15720 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61  tion .  ** or sa
15730 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15740 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71   done at the req
15750 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  uest of the call
15760 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20  er) or this is. 
15770 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
15780 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69  l rollback. If i
15790 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t is a hot-journ
157a0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  al rollback, the
157b0 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69   pager.  ** is i
157c0 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64  n state OPEN and
157d0 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53   holds an EXCLUS
157e0 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f  IVE lock. Hot-jo
157f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20  urnal rollback. 
15800 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66   ** only reads f
15810 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
15820 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75  rnal, not the su
15830 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  b-journal..  */.
15840 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15850 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
15860 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
15870 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
15880 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
15890 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d  _OPEN && pPager-
158a0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
158b0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61  E_LOCK).  );.  a
158c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
158d0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
158e0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20  TER_CACHEMOD || 
158f0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20  isMainJrnl );.. 
15900 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
15910 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
15920 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
15930 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
15940 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
15950 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
15960 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
15970 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
15980 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
15990 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
159a0 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
159b0 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
159c0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
159d0 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
159e0 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
159f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
15a10 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
15a20 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
15a30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15a40 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
15a50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15a60 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15a70 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
15a80 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
15a90 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
15aa0 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
15ab0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
15ac0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
15ad0 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
15ae0 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
15af0 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
15b00 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
15b10 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
15b20 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
15b30 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
15b40 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
15b50 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
15b60 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
15b70 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
15b80 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
15b90 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
15ba0 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
15bb0 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
15bc0 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
15bd0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
15be0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
15bf0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
15c00 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
15c10 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
15c20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15c30 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
15c40 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
15c50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
15c60 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
15c70 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
15c80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15c90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
15ca0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
15cb0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
15cc0 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
15cd0 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
15ce0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
15cf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
15d00 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
15d10 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
15d20 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
15d30 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
15d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
15d50 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
15d60 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
15d70 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
15d80 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72   played by befor
15d90 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  e during the cur
15da0 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  rent.  ** rollba
15db0 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62  ck, then don't b
15dc0 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74  other to play it
15dd0 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a   back again..  *
15de0 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  /.  if( pDone &&
15df0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
15e00 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
15e10 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
15e20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
15e30 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  c;.  }..  /* Whe
15e40 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70  n playing back p
15e50 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74  age 1, restore t
15e60 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74  he nReserve sett
15e70 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
15e80 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72  gno==1 && pPager
15e90 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38  ->nReserve!=((u8
15ea0 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a  *)aData)[20] ){.
15eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
15ec0 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61  erve = ((u8*)aDa
15ed0 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67  ta)[20];.    pag
15ee0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
15ef0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
15f00 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
15f10 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74  in CACHEMOD stat
15f20 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
15f30 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
15f40 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
15f50 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
15f60 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
15f70 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
15f80 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
15f90 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
15fa0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
15fb0 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
15fc0 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
15fd0 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
15fe0 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
15ff0 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
16000 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
16010 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
16020 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
16030 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
16040 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
16050 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
16060 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
16070 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
16080 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
16090 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
160a0 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
160b0 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
160c0 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
160d0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
160e0 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
160f0 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
16100 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
16110 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
16120 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
16130 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
16140 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
16150 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
16160 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52  WRITER_DBMOD, WR
16170 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72  ITER_FINISHED or
16180 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65   OPEN state, the
16190 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a  n we update the.
161a0 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65    ** pager cache
161b0 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e   if it exists an
161c0 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
161d0 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
161e0 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e  n marked .  ** n
161f0 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20  ot dirty. Since 
16200 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c  this code is onl
16210 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41  y executed in PA
16220 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66  GER_OPEN state f
16230 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  or.  ** a hot-jo
16240 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
16250 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
16260 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63   that the page-c
16270 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20  ache is empty.  
16280 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
16290 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65  is in OPEN state
162a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
162b0 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
162c0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
162d0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
162e0 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
162f0 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
16300 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
16310 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
16320 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
16330 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
16340 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
16350 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
16360 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
16370 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
16380 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
16390 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
163a0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
163b0 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
163c0 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
163d0 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
163e0 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
163f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
16400 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
16410 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
16420 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
16430 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
16440 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
16450 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
16460 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
16470 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
16480 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
16490 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
164a0 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
164b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
164c0 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
164d0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
164e0 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
164f0 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
16500 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
16510 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
16520 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
16530 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
16540 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
16550 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16560 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
16570 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
16580 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
16590 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
165a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
165b0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
165c0 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
165d0 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
165e0 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
165f0 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
16600 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
16610 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
16620 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
16630 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
16640 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
16650 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
16660 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
16670 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
16680 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
16690 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
166a0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
166b0 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
166c0 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
166d0 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
166e0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
166f0 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
16700 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
16710 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
16720 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
16730 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
16740 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
16750 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
16760 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16770 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
16780 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
16790 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
167a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
167b0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
167c0 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g==0 );.  PAGERT
167d0 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
167e0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
167f0 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
16800 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
16810 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
16820 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
16830 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
16840 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
16850 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
16860 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
16870 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
16880 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
16890 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
168a0 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
168b0 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
168c0 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
168d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
168e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
168f0 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
16900 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
16910 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
16920 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
16930 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
16940 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
16950 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
16960 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
16970 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
16980 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
16990 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
169a0 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
169b0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
169c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
169d0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
169e0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
169f0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
16a00 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
16a10 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
16a20 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
16a30 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
16a40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
16a50 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
16a60 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
16a70 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
16a80 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
16a90 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
16aa0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
16ab0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
16ac0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
16ad0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
16ae0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
16af0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
16b00 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
16b10 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
16b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
16b30 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
16b40 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
16b50 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
16b60 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
16b70 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
16b80 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
16b90 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  MEM, aData);.   
16ba0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
16bb0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
16bc0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
16bd0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
16be0 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
16bf0 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
16c00 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
16c10 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
16c20 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
16c30 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
16c40 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
16c50 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
16c60 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
16c70 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
16c80 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
16c90 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
16ca0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
16cb0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
16cc0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
16cd0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
16ce0 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
16cf0 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
16d00 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
16d10 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
16d20 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
16d30 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
16d40 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
16d50 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
16d60 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
16d70 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
16d80 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
16d90 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
16da0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
16db0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
16dc0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
16dd0 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
16de0 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
16df0 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
16e00 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
16e10 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
16e20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
16e30 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
16e40 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
16e50 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
16e60 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
16e70 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
16e80 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
16e90 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
16ea0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
16eb0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
16ec0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
16ed0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
16ee0 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
16ef0 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
16f00 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
16f10 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
16f20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
16f30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
16f40 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
16f50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16f60 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b  doNotSpill==0 );
16f70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
16f80 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72  otSpill++;.    r
16f90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16fa0 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
16fb0 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a  pgno, &pPg, 1);.
16fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16fd0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d  er->doNotSpill==
16fe0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
16ff0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20  >doNotSpill--;. 
17000 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17010 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
17020 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
17030 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
17040 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
17050 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
17060 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
17070 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
17080 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
17090 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
170a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
170b0 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
170c0 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
170d0 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
170e0 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
170f0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
17100 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
17110 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
17120 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
17130 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
17140 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
17150 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
17160 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
17170 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
17180 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
17190 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
171a0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
171b0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
171c0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
171d0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
171e0 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
171f0 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
17200 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17210 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
17220 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
17230 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
17240 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
17250 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
17260 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
17270 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
17280 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
17290 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
172a0 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
172b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
172c0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
172d0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
172e0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
172f0 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
17300 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
17310 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
17320 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
17330 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
17340 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
17350 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
17360 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
17370 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
17380 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
17390 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
173a0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
173b0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
173c0 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
173d0 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
173e0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
173f0 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
17400 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
17410 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17420 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
17430 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
17440 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
17450 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
17460 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
17470 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
17480 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
17490 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
174a0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
174b0 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
174c0 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
174d0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
174e0 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
174f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17500 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
17510 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
17520 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
17530 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
17540 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
17550 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
17560 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
17570 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17580 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
17590 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
175a0 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
175b0 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
175c0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
175d0 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
175e0 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
175f0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
17600 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17610 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
17620 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
17630 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
17640 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
17650 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
17660 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
17670 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
17680 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
17690 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
176a0 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
176b0 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
176c0 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
176d0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
176e0 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
176f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17700 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17710 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
17730 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
17740 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  g);.    }.    pa
17750 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
17760 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  (pPg);..    /* I
17770 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
17780 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
17790 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
177a0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
177b0 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
177c0 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
177d0 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
177e0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
177f0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
17800 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
17810 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
17820 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
17830 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
17840 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
17850 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
17860 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
17870 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
17880 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
17890 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
178a0 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c  _NOMEM);.    sql
178b0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
178c0 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
178d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
178e0 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
178f0 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
17900 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
17910 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
17920 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
17930 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
17940 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
17950 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
17960 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
17970 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
17980 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
17990 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
179a0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
179b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
179c0 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
179d0 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
179e0 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
179f0 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
17a00 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
17a10 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
17a20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
17a30 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
17a40 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
17a50 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
17a60 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17a70 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
17a80 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
17a90 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
17aa0 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
17ab0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
17ac0 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
17ad0 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
17ae0 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
17af0 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
17b00 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
17b10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
17b20 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
17b30 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
17b40 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
17b50 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
17b60 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
17b70 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
17b80 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
17b90 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
17ba0 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
17bb0 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
17bc0 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
17bd0 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
17be0 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
17bf0 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
17c00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17c10 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
17c20 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
17c30 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
17c40 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
17c50 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
17c60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
17c70 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
17c80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
17c90 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
17ca0 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
17cb0 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
17cc0 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
17cd0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
17ce0 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
17cf0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
17d00 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
17d10 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
17d20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
17d30 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
17d40 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
17d50 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
17d60 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
17d70 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
17d80 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
17d90 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
17da0 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
17db0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
17dc0 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
17dd0 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
17de0 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
17df0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
17e00 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
17e10 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
17e20 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
17e30 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
17e40 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
17e50 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
17e60 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
17e70 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
17e80 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
17e90 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
17ea0 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
17eb0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
17ec0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
17ed0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
17ee0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
17ef0 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
17f00 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
17f10 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
17f20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
17f30 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
17f40 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
17f50 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
17f60 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
17f70 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
17f80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
17f90 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
17fa0 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
17fb0 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
17fc0 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
17fd0 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
17fe0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
17ff0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
18000 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
18010 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
18020 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
18030 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
18040 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
18050 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
18060 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
18070 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
18080 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
18090 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
180a0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
180b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
180c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
180d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
180e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
180f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
18100 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
18110 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
18120 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
18130 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
18140 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
18150 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
18160 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
18170 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
18180 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
18190 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
181a0 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
181b0 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
181c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
181d0 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
181e0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
181f0 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
18200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18210 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
18220 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
18230 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
18240 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
18250 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18260 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
18270 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
18280 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
18290 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
182a0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
182b0 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
182c0 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
182d0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
182e0 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
182f0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
18300 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
18310 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
18320 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
18330 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
18340 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
18350 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
18360 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
18370 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
18380 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
18390 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
183a0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
183b0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
183c0 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
183d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
183e0 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
183f0 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
18400 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
18410 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
18420 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
18430 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
18440 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 23 69 66  int flags = .#if
18450 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
18460 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
18470 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66       (pPager->vf
18480 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
18490 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f  EN_FILEPROTECTIO
184a0 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a  N_MASK)|.#endif.
184b0 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
184c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
184d0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
184e0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
184f0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
18500 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
18510 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
18520 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
18530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
18540 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18550 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ..  /* Load the 
18560 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
18570 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
18580 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
18590 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  rom.  ** sqlite3
185a0 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
185b0 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
185c0 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c  terJournal.   Al
185d0 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73  so obtain.  ** s
185e0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
185f0 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20  (in zMasterPtr) 
18600 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
18610 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a  s of master.  **
18620 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65   journal files e
18630 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
18640 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a  gular rollback-j
18650 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
18660 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
18670 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
18680 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
18690 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
186a0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
186b0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d  master_out;.  nM
186c0 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d  asterPtr = pVfs-
186d0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
186e0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
186f0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
18700 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
18710 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
18720 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d   + 1);.  if( !zM
18730 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
18740 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18750 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
18760 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
18770 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20   }.  zMasterPtr 
18780 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
18790 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
187a0 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  +1];.  rc = sqli
187b0 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
187c0 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
187d0 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
187e0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66  ournal, 0);.  if
187f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18800 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
18810 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  _out;.  zMasterJ
18820 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
18830 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a  urnal] = 0;..  z
18840 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
18850 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c  rJournal;.  whil
18860 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
18870 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
18880 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
18890 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
188a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
188b0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
188c0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
188d0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
188e0 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20  xists);.    if( 
188f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18900 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
18910 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
18920 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20  .    if( exists 
18930 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ){.      /* One 
18940 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
18950 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
18960 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18970 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a   exists..      *
18980 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
18990 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
189a0 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
189b0 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
189c0 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
189d0 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
189e0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
189f0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  al file..      *
18a00 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20  /.      int c;. 
18a10 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
18a20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
18a30 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
18a40 49 4f 4e 0a 20 20 20 20 20 20 20 20 28 70 50 61  ION.        (pPa
18a50 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51  ger->vfsFlags&SQ
18a60 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52  LITE_OPEN_FILEPR
18a70 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a  OTECTION_MASK)|.
18a80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 28  #endif.        (
18a90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18aa0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
18ab0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
18ac0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18ad0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
18ae0 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
18af0 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
18b00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18b10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18b20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18b30 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
18b40 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
18b50 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
18b60 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
18b70 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
18b80 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
18b90 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
18ba0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18bb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18bc0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18bd0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
18be0 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
18bf0 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
18c00 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
18c10 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
18c20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
18c30 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
18c40 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
18c50 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
18c60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
18c70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
18c80 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18c90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
18ca0 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
18cb0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
18cc0 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
18cd0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18ce0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
18cf0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
18d00 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
18d10 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
18d20 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
18d30 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
18d40 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
18d50 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
18d60 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
18d70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
18d80 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
18d90 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
18da0 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
18db0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18dc0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
18dd0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
18de0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
18df0 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
18e00 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
18e10 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
18e20 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
18e30 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
18e40 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
18e50 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
18e60 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
18e70 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
18e80 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
18e90 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
18ea0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
18eb0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
18ec0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
18ed0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
18ee0 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44  t in either.** D
18ef0 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  BMOD or OPEN sta
18f00 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
18f10 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
18f20 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
18f30 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  e .** of the fil
18f40 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
18f50 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
18f60 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
18f70 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20  ize bytes). .** 
18f80 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
18f90 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
18fa0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
18fb0 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
18fc0 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
18fd0 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
18fe0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
18ff0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
19000 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
19010 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
19020 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
19030 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
19040 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
19050 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
19060 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
19070 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
19080 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
19090 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
190a0 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
190b0 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
190c0 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
190d0 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
190e0 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
190f0 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
19100 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
19110 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
19120 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
19130 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
19140 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
19150 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
19160 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
19170 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
19180 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
19190 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
191a0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
191b0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
191c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
191d0 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
191e0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
191f0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
19200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
19210 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
19220 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
19230 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
19240 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
19250 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
19260 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70   .  if( isOpen(p
19270 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26  Pager->fd) .   &
19280 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
19290 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
192a0 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
192b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
192c0 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69  PEN) .  ){.    i
192d0 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
192e0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  newSize;.    int
192f0 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
19300 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
19310 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19320 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19330 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
19340 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
19350 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
19360 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
19370 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
19380 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
19390 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
193a0 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
193b0 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36  ize = szPage*(i6
193c0 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
193d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
193e0 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
193f0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
19400 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
19410 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
19420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19430 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
19440 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
19450 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
19460 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50  (currentSize+szP
19470 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b  age)<=newSize ){
19480 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
19490 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Tmp = pPager->pT
194a0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20  mpSpace;.       
194b0 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c   memset(pTmp, 0,
194c0 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20   szPage);.      
194d0 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
194e0 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20  Size-szPage) == 
194f0 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
19500 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19510 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
19520 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65  ) >  currentSize
19530 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
19540 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
19550 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70  pPager->fd, pTmp
19560 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a  , szPage, newSiz
19570 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  e-szPage);.     
19580 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
19590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
195a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
195b0 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
195c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
195d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
195e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
195f0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
19600 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
19610 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
19620 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
19630 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
19640 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
19650 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
19660 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
19670 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
19680 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
19690 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
196a0 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
196b0 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
196c0 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
196d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
196e0 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
196f0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
19700 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
19710 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
19720 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
19730 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
19740 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
19750 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
19760 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
19770 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
19780 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
19790 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
197a0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
197b0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
197c0 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
197d0 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
197e0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
197f0 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
19800 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
19810 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
19820 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
19830 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
19840 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
19850 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  R_SIZE..**.** If
19860 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68   the file has th
19870 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  e SQLITE_IOCAP_P
19880 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
19890 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  TE property, the
198a0 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66  n set.** the eff
198b0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
198c0 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  ze to its minimu
198d0 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20  m value (512).  
198e0 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a  The purpose of.*
198f0 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  * pPager->sector
19900 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e  Size is to defin
19910 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64  e the "blast rad
19920 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68  ius" of bytes th
19930 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
19940 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63  ge if a crash oc
19950 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69  curs while writi
19960 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62  ng to a single b
19970 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72  yte in.** that r
19980 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20  ange.  But with 
19990 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
199a0 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72  ITE, the blast r
199b0 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a  adius is zero.**
199c0 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50   (that is what P
199d0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
199e0 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65  TE means), so we
199f0 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65   minimize the se
19a00 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46  ctor.** size.  F
19a10 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
19a20 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68  patibility of th
19a30 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
19a40 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a  al file format,.
19a50 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64  ** we cannot red
19a60 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
19a70 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65  e sector size be
19a80 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74  low 512..*/.stat
19a90 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
19aa0 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
19ab0 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
19ac0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
19ad0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
19ae0 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
19af0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
19b00 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  e.   || (sqlite3
19b10 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
19b20 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
19b30 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20  fd) & .         
19b40 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
19b50 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
19b60 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20  WRITE)!=0.  ){. 
19b70 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
19b80 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
19b90 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
19ba0 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
19bb0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
19bc0 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
19bd0 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
19be0 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
19bf0 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
19c00 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
19c10 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ault. */.    pPa
19c20 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
19c30 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 512;.  }else{.
19c40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
19c50 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
19c60 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
19c70 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66  ger->fd);.    if
19c80 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
19c90 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20 20  Size<32 ){.     
19ca0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
19cb0 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 7d  ize = 512;.    }
19cc0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
19cd0 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  >sectorSize>MAX_
19ce0 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
19cf0 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58       assert( MAX
19d00 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
19d10 32 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  2 );.      pPage
19d20 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
19d30 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  MAX_SECTOR_SIZE;
19d40 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
19d50 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
19d60 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
19d70 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
19d80 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
19d90 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
19da0 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
19db0 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
19dc0 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
19dd0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
19de0 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
19df0 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
19e00 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
19e10 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
19e20 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
19e30 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
19e40 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
19e50 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
19e60 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
19e70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
19e80 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
19e90 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
19ea0 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
19eb0 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
19ec0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
19ed0 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
19ee0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
19ef0 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
19f00 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
19f10 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
19f20 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
19f30 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
19f40 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
19f50 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
19f60 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
19f70 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
19f80 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
19f90 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
19fa0 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
19fb0 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
19fc0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
19fd0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
19fe0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
19ff0 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
1a000 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
1a010 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
1a020 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
1a030 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
1a040 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1a050 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1a060 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  is the page size
1a070 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20  ..**  (7)  zero 
1a080 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74  padding out to t
1a090 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73  he next sector s
1a0a0 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65  ize..**  (8)  Ze
1a0b0 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
1a0c0 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
1a0d0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
1a0e0 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1a0f0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1a100 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
1a110 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1a120 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
1a130 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
1a140 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
1a150 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
1a160 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1a170 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
1a180 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f  irst 7 items abo
1a190 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
1a1a0 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
1a1b0 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
1a1c0 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e  of the 8th item.
1a1d0 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
1a1e0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
1a1f0 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
1a200 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
1a210 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
1a220 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
1a230 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1a240 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
1a250 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
1a260 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
1a270 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
1a280 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1a290 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
1a2a0 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
1a2b0 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
1a2c0 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
1a2d0 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
1a2e0 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
1a2f0 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
1a300 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a310 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
1a320 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1a330 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
1a340 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
1a350 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
1a360 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
1a370 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
1a380 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
1a390 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
1a3a0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
1a3b0 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
1a3c0 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
1a3d0 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
1a3e0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
1a3f0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
1a400 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
1a410 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
1a420 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1a430 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
1a440 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
1a450 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
1a460 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
1a470 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
1a480 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
1a490 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
1a4a0 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
1a4b0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
1a4c0 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
1a4d0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
1a4e0 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
1a4f0 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
1a500 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
1a510 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1a520 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
1a530 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
1a540 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
1a550 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
1a560 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
1a570 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1a580 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
1a590 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
1a5a0 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
1a5b0 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
1a5c0 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
1a5d0 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
1a5e0 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
1a5f0 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
1a600 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
1a610 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1a620 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
1a630 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
1a640 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
1a650 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1a660 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
1a670 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
1a680 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
1a690 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
1a6a0 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
1a6b0 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1a6c0 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
1a6d0 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
1a6e0 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
1a6f0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1a700 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
1a710 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20  isHot parameter 
1a720 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77  indicates that w
1a730 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
1a740 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e  rollback a journ
1a750 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74  al.** that might
1a760 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   be a hot journa
1a770 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64  l.  Or, it could
1a780 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75   be that the jou
1a790 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73  rnal is .** pres
1a7a0 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66  erved because of
1a7b0 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52   JOURNALMODE_PER
1a7c0 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d  SIST or JOURNALM
1a7d0 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a  ODE_TRUNCATE..**
1a7e0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1a7f0 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72  really is hot, r
1a800 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63  eset the pager c
1a810 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69  ache prior rolli
1a820 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63  ng.** back any c
1a830 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20  ontent.  If the 
1a840 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c  journal is merel
1a850 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f  y persistent, no
1a860 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65   reset is.** nee
1a870 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
1a880 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
1a890 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
1a8a0 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
1a8b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1a8c0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
1a8d0 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a8f0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1a900 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
1a910 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a930 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
1a940 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
1a950 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a970 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1a980 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
1a990 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
1a9a0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a9b0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
1a9c0 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
1a9d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a9f0 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
1aa00 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1aa10 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
1aa20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1aa30 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
1aa40 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
1aa50 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
1aa60 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1aa70 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
1aa80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
1aa90 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65  any */.  int nee
1aaa0 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20  dPagerReset;    
1aab0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
1aac0 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f  et page prior to
1aad0 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c   first page roll
1aae0 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  back */..  /* Fi
1aaf0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1ab00 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1ab10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1ab20 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1ab30 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1ab40 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1ab50 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1ab60 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1ab70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1ab80 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1ab90 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1aba0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1abb0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1abc0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1abd0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1abe0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1abf0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1ac00 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1ac10 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1ac20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1ac30 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1ac40 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1ac50 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1ac60 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1ac70 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1ac80 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1ac90 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1aca0 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1acb0 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1acc0 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1acd0 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1ace0 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1acf0 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1ad00 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1ad10 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1ad20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1ad30 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1ad40 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1ad50 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1ad60 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1ad70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1ad80 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1ad90 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74  x.c,.  **  mxPat
1ada0 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68  hname is 512, wh
1adb0 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
1adc0 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61  as the minimum a
1add0 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20  llowable value. 
1ade0 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65   ** for pageSize
1adf0 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
1ae00 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1ae10 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
1ae20 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1ae30 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1ae40 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1ae50 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1ae60 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ae70 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1ae80 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
1ae90 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1aea0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
1aeb0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1aec0 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
1aed0 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
1aee0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1aef0 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
1af00 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1af10 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
1af20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1af30 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65  0;.  needPagerRe
1af40 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20  set = isHot;..  
1af50 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
1af60 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
1af70 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61  hen a readJourna
1af80 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20  lHdr() or .  ** 
1af90 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1afa0 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72  ne_page() call r
1afb0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1afc0 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
1afd0 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20  r .  ** occurs. 
1afe0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  .  */.  while( 1
1aff0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   ){.    /* Read 
1b000 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
1b010 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
1b020 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1b030 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
1b040 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
1b050 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
1b060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1b070 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
1b080 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
1b090 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
1b0a0 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
1b0b0 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1b0c0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
1b0d0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
1b0e0 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
1b0f0 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
1b100 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
1b110 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
1b120 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
1b130 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
1b140 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
1b150 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b160 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
1b170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1b180 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
1b190 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b1a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1b1b0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1b1c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1b1d0 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
1b1e0 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
1b1f0 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
1b200 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
1b210 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
1b220 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
1b230 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1b240 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
1b250 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
1b260 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
1b270 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
1b280 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
1b290 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
1b2a0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
1b2b0 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
1b2c0 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
1b2d0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1b2e0 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
1b2f0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
1b300 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1b310 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1b320 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1b330 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
1b340 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
1b350 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b360 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
1b370 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1b380 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1b390 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
1b3a0 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
1b3b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
1b3c0 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
1b3d0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
1b3e0 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
1b3f0 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
1b400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
1b410 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
1b420 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
1b430 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1b440 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
1b450 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
1b460 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
1b470 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
1b480 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
1b490 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
1b4a0 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
1b4b0 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
1b4c0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1b4d0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
1b4e0 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
1b4f0 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
1b500 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
1b510 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
1b520 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1b530 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
1b540 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
1b550 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
1b560 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
1b570 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
1b580 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
1b590 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1b5a0 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
1b5b0 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
1b5c0 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
1b5d0 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
1b5e0 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
1b5f0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1b600 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1b610 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1b620 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
1b630 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
1b640 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1b650 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
1b660 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
1b670 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
1b680 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
1b690 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
1b6a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b6b0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1b6c0 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
1b6d0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
1b6e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b6f0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1b700 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1b710 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1b720 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
1b730 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
1b740 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
1b750 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
1b760 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1b770 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1b780 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
1b790 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
1b7a0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
1b7b0 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
1b7c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
1b7d0 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
1b7e0 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
1b7f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1b800 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1b810 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1b820 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
1b830 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1b840 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
1b850 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b870 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1b880 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
1b890 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1b8a0 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
1b8b0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
1b8c0 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
1b8d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1b8e0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
1b8f0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
1b900 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
1b910 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
1b920 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
1b930 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
1b940 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
1b950 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
1b960 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1b970 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
1b980 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
1b990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1b9a0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1b9b0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
1b9c0 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er,&pPager->jour
1b9d0 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20  nalOff,0,1,0);. 
1b9e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b9f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ba00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ba10 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1ba20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1ba30 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1ba40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ba50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ba60 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1ba70 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1ba80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1ba90 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1baa0 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1bab0 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1bac0 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1bad0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1bae0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1baf0 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1bb00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1bb10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1bb20 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1bb30 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1bb40 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1bb50 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1bb60 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1bb70 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1bb80 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1bb90 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1bba0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1bbb0 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1bbc0 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1bbd0 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1bbe0 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1bbf0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1bc00 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1bc10 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1bc20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1bc30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1bc40 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1bc50 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1bc60 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1bc70 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1bc80 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1bc90 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1bca0 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1bcb0 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1bcc0 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1bcd0 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1bce0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1bcf0 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1bd00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1bd10 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1bd20 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1bd30 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1bd40 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1bd50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1bd60 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1bd70 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1bd80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bd90 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1bda0 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1bdb0 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1bdc0 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
1bdd0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
1bde0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1bdf0 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
1be00 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
1be10 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
1be20 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1be30 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
1be40 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
1be50 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1be60 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
1be70 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
1be80 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
1be90 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
1bea0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1beb0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
1bec0 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64  ified..  */.#ifd
1bed0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1bee0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64    if( pPager->fd
1bef0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1bf00 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
1bf10 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
1bf20 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
1bf30 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
1bf40 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
1bf50 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
1bf60 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
1bf70 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
1bf80 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1bf90 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
1bfa0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
1bfb0 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
1bfc0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1bfd0 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
1bfe0 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
1bff0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c000 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
1c010 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
1c020 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
1c030 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
1c040 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
1c050 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
1c060 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
1c070 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
1c080 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
1c090 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
1c0a0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
1c0b0 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
1c0c0 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
1c0d0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1c0e0 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
1c0f0 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
1c100 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
1c110 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
1c120 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
1c130 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
1c140 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
1c150 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
1c160 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
1c170 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
1c180 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1c190 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
1c1a0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1c1b0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
1c1c0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
1c1d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c1e0 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
1c1f0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1c200 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
1c210 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1c220 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1c230 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1c240 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1c250 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
1c260 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c270 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c280 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
1c290 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1c2a0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1c2b0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1c2c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1c2d0 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  EN).  ){.    rc 
1c2e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
1c2f0 6e 63 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nc(pPager);.  }.
1c300 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c310 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1c320 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
1c330 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
1c340 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
1c350 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1c360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1c370 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1c380 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1c390 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
1c3a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1c3b0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
1c3c0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
1c3d0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1c3e0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
1c3f0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
1c400 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
1c410 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1c420 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
1c430 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
1c440 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
1c450 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
1c460 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c470 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
1c480 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1c490 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1c4a0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1c4b0 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1c4c0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1c4d0 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1c4e0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1c4f0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1c500 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1c510 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1c520 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1c530 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1c540 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1c550 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1c560 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c570 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1c580 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1c590 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1c5a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c5b0 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1c5c0 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1c5d0 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1c5e0 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1c5f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1c600 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1c610 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c620 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1c630 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1c640 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1c650 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1c660 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1c670 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1c680 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1c690 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1c6a0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1c6b0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1c6c0 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1c6d0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1c6e0 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1c6f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1c700 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1c710 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1c720 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1c730 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c740 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1c750 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1c760 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1c770 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1c780 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1c790 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1c7a0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1c7b0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1c7c0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1c7d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1c7e0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61   */.  int isInWa
1c7f0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1c800 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
1c810 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c  ge is in log fil
1c820 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1c830 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1c840 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1c850 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1c860 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1c870 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1c880 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1c890 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1c8a0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c8b0 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
1c8c0 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
1c8d0 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
1c8e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c8f0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1c900 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1c910 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1c920 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
1c930 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c940 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
1c950 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
1c960 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
1c970 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
1c980 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
1c990 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
1c9a0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
1c9b0 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  d(pPager->pWal, 
1c9c0 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20  pgno, &isInWal, 
1c9d0 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1c9e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c9f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69  =SQLITE_OK && !i
1ca00 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36  sInWal ){.    i6
1ca10 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1ca20 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1ca30 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1ca40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1ca50 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1ca60 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1ca70 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1ca80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1ca90 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1caa0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1cab0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1cac0 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1cad0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1cae0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1caf0 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1cb00 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1cb10 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1cb20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1cb30 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1cb40 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1cb50 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1cb60 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1cb70 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1cb80 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1cb90 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1cba0 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1cbb0 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1cbc0 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1cbd0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1cbe0 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1cbf0 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1cc00 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1cc10 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1cc20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1cc30 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1cc40 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1cc50 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1cc60 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1cc70 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1cc80 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1cc90 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1cca0 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1ccb0 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1ccc0 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1ccd0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1cce0 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1ccf0 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1cd00 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1cd10 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1cd20 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1cd30 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1cd40 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36  sing equaling 16
1cd50 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69   bytes of 0xff i
1cd60 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  s vanishingly sm
1cd70 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  all so.      ** 
1cd80 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  we should still 
1cd90 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  be ok..      */.
1cda0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
1cdb0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1cdc0 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50   0xff, sizeof(pP
1cdd0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1cde0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1cdf0 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56       u8 *dbFileV
1ce00 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
1ce10 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
1ce20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1ce30 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1ce40 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1ce50 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1ce60 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20  eVers));.    }. 
1ce70 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
1ce80 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
1ce90 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
1cea0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
1ceb0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1cec0 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1ced0 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
1cee0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
1cef0 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
1cf00 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
1cf10 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1cf20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
1cf30 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
1cf40 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1cf60 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1cf70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1cf80 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
1cf90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cfa0 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61  ** Update the va
1cfb0 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  lue of the chang
1cfc0 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66  e-counter at off
1cfd0 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69  sets 24 and 92 i
1cfe0 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  n.** the header 
1cff0 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76  and the sqlite v
1d000 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74  ersion number at
1d010 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a   offset 96..**.*
1d020 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63  * This is an unc
1d030 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
1d040 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65  e.  See also the
1d050 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1d060 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72  gecounter().** r
1d070 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c  outine which onl
1d080 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1d090 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20  ange-counter if 
1d0a0 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63  the update is ac
1d0b0 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64  tually.** needed
1d0c0 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20  , as determined 
1d0d0 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63  by the pPager->c
1d0e0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73  hangeCountDone s
1d0f0 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  tate variable..*
1d100 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
1d110 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1d120 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70  counter(PgHdr *p
1d130 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67  Pg){.  u32 chang
1d140 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a  e_counter;..  /*
1d150 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1d160 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1d170 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1d180 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1d190 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1d1a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
1d1b0 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61  te((u8*)pPg->pPa
1d1c0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1d1d0 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  +1;.  put32bits(
1d1e0 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1d1f0 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
1d200 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41  ounter);..  /* A
1d210 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51  lso store the SQ
1d220 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
1d230 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e  ber in bytes 96.
1d240 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20  .99 and in.  ** 
1d250 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f  bytes 92..95 sto
1d260 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  re the change co
1d270 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20  unter for which 
1d280 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
1d290 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64  er.  ** is valid
1d2a0 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
1d2b0 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1d2c0 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
1d2d0 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33  counter);.  put3
1d2e0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1d2f0 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  g->pData)+96, SQ
1d300 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
1d310 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  BER);.}..#ifndef
1d320 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1d330 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1d340 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
1d350 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
1d360 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ge that has alre
1d370 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69  ady been .** wri
1d380 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f  tten into the lo
1d390 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41  g file when a WA
1d3a0 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1d3b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
1d3c0 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69   Parameter iPg i
1d3d0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1d3e0 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20  r of said page. 
1d3f0 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e  The pCtx argumen
1d400 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c  t .** is actuall
1d410 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
1d420 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1d430 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  re..**.** If pag
1d440 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74  e iPg is present
1d450 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61   in the cache, a
1d460 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  nd has no outsta
1d470 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1d480 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61  ,.** it is disca
1d490 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rded. Otherwise,
1d4a0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
1d4b0 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61  e or more outsta
1d4c0 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e  nding.** referen
1d4d0 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f  ces, the page co
1d4e0 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65  ntent is reloade
1d4f0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1d500 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  ase. If the.** a
1d510 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64  ttempt to reload
1d520 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1d530 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
1d540 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73  quired and fails
1d550 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
1d560 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1d570 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
1d580 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
1d590 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f  ic int pagerUndo
1d5a0 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
1d5b0 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a  Ctx, Pgno iPg){.
1d5c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d5d0 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1d5e0 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
1d5f0 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a  )pCtx;.  PgHdr *
1d600 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71  pPg;..  pPg = sq
1d610 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1d620 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
1d630 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1d640 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
1d650 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
1d660 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
1d670 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
1d680 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
1d690 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1d6a0 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
1d6b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d6c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d6d0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1d6e0 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1d6f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1d700 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1d710 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1d720 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1d730 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1d740 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1d750 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1d760 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1d770 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1d780 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1d790 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1d7a0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1d7b0 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1d7c0 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1d7d0 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1d7e0 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1d7f0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1d800 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1d810 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1d820 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1d830 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1d840 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1d850 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1d860 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1d870 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1d880 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1d890 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1d8a0 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1d8b0 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1d8c0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1d8d0 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1d8e0 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1d8f0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1d900 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1d910 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1d920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d930 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d940 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1d950 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1d960 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1d970 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1d980 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1d990 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1d9a0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1d9b0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1d9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d9d0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1d9e0 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da00 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1da10 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1da20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1da30 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1da40 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1da50 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1da60 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1da70 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1da80 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1da90 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1daa0 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1dab0 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1dac0 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1dad0 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1dae0 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1daf0 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1db00 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1db10 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1db20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1db30 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1db40 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1db50 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1db60 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1db70 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1db80 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1db90 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1dba0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1dbb0 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1dbc0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1dbd0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1dbe0 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1dbf0 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1dc00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1dc10 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1dc20 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1dc30 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1dc40 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1dc50 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1dc60 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1dc70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1dc80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1dc90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1dca0 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1dcb0 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1dcc0 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1dcd0 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1dce0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1dcf0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1dd00 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1dd10 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1dd20 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1dd30 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1dd40 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1dd50 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1dd60 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1dd70 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a  ** changed. .**.
1dd80 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1dd90 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1dda0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ddb0 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1ddc0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1ddd0 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1dde0 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1ddf0 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1de00 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1de10 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1de20 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1de30 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1de40 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de60 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1de70 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1dea0 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1deb0 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1dee0 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1def0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1df00 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1df10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1df20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1df30 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
1df40 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1df50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1df60 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 23 69  eturn code */.#i
1df70 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1df80 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1df90 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ed(SQLITE_CHECK_
1dfa0 50 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a  PAGES).  PgHdr *
1dfb0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1dfc0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1dfd0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67  looping over pag
1dfe0 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  es */.#endif..  
1dff0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e000 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  pWal );.  assert
1e010 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65  ( pList );.#ifde
1e020 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1e030 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1e040 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73  the page list is
1e050 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
1e060 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  der */.  for(p=p
1e070 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44  List; p && p->pD
1e080 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74  irty; p=p->pDirt
1e090 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1e0a0 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69  p->pgno < p->pDi
1e0b0 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d  rty->pgno );.  }
1e0c0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1e0d0 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f  sCommit ){.    /
1e0e0 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73  * If a WAL trans
1e0f0 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
1e100 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65  committed, there
1e110 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1e120 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61  writing.    ** a
1e130 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61  ny pages with pa
1e140 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1e150 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74  er than nTruncat
1e160 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66  e into the WAL f
1e170 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79  ile..    ** They
1e180 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72   will never be r
1e190 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e  ead by any clien
1e1a0 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65  t. So remove the
1e1b0 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74  m from the pDirt
1e1c0 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65  y.    ** list he
1e1d0 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72  re. */.    PgHdr
1e1e0 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a   *p;.    PgHdr *
1e1f0 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74  *ppNext = &pList
1e200 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  ;.    for(p=pLis
1e210 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29  t; (*ppNext = p)
1e220 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e230 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1e240 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 20 70  o<=nTruncate ) p
1e250 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72  pNext = &p->pDir
1e260 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ty;.    }.    as
1e270 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1e280 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d   }..  if( pList-
1e290 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1e2a0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1e2b0 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1e2c0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1e2d0 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1e2e0 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1e2f0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1e300 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1e310 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1e320 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1e330 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e340 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1e350 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1e360 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
1e370 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1e380 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1e390 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1e3a0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1e3b0 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
1e3c0 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
1e3d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1e3e0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1e3f0 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20  PAGES.  pList = 
1e400 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1e410 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1e420 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70  PCache);.  for(p
1e430 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1e440 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67  pDirty){.    pag
1e450 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
1e460 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
1e470 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e480 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65  /*.** Begin a re
1e490 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad transaction o
1e4a0 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a  n the WAL..**.**
1e4b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1e4c0 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1e4d0 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68  "pagerOpenSnapsh
1e4e0 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74  ot()" because it
1e4f0 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20   essentially.** 
1e500 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74  makes a snapshot
1e510 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e520 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
1e530 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e  point in time an
1e540 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74  d preserves.** t
1e550 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72  hat snapshot for
1e560 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64   use by the read
1e570 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63  er in spite of c
1e580 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e  oncurrently chan
1e590 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20  ges by.** other 
1e5a0 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b  writers or check
1e5b0 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
1e5c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67  tic int pagerBeg
1e5d0 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1e5e0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
1e5f0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e620 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e  de */.  int chan
1e630 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ged = 0;        
1e640 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e650 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  if cache must be
1e660 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73   reset */..  ass
1e670 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1e680 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
1e690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1e6a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1e6b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1e6c0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
1e6d0 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65   );..  /* sqlite
1e6e0 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1e6f0 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74  action() was not
1e700 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
1e710 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72  previous.  ** tr
1e720 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63  ansaction in loc
1e730 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
1e740 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74  IVE.  So call it
1e750 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a   now.  If we.  *
1e760 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67  * are in locking
1e770 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64  _mode=NORMAL and
1e780 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70   EndRead() was p
1e790 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
1e7a0 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69  ,.  ** the dupli
1e7b0 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72  cate call is har
1e7c0 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  mless..  */.  sq
1e7d0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1e7e0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1e7f0 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20  r->pWal);..  rc 
1e800 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
1e810 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1e820 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
1e830 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20  changed);.  if( 
1e840 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1e850 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
1e860 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1e870 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  er);.  }..  retu
1e880 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1e890 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1e8a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
1e8b0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
1e8c0 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41  ansition from PA
1e8d0 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50  GER_OPEN.** to P
1e8e0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
1e8f0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
1e900 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1e910 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1e920 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69  in pages (assumi
1e930 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ng the page size
1e940 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1e950 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53  d in Pager.pageS
1e960 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ize)..**.** If n
1e970 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1e980 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e990 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69  urned and the si
1e9a0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1e9b0 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69  se.** in pages i
1e9c0 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50  s stored in *pnP
1e9d0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
1e9e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70  an error code (p
1e9f0 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45  erhaps.** SQLITE
1ea00 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73  _IOERR_FSTAT) is
1ea10 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1ea20 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
1ea30 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
1ea40 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
1ea50 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
1ea60 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61  ager, Pgno *pnPa
1ea70 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1ea80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ea90 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1eaa0 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
1eab0 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51  nPage */..  /* Q
1eac0 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62  uery the WAL sub
1ead0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
1eae0 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54  database size. T
1eaf0 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20  he WalDbsize(). 
1eb00 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74   ** function ret
1eb10 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65  urns zero if the
1eb20 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e   WAL is not open
1eb30 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61   (i.e. Pager.pWa
1eb40 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69  l==0), or.  ** i
1eb50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1eb60 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ize is not avail
1eb70 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61  able. The databa
1eb80 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20  se size is not. 
1eb90 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72   ** available fr
1eba0 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1ebb0 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67  ystem if the log
1ebc0 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f   file is empty o
1ebd0 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  r.  ** contains 
1ebe0 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74  no valid committ
1ebf0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
1ec00 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ec10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1ec20 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
1ec30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ec40 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
1ec50 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  CK || pPager->no
1ec60 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 6e 50  Readlock );.  nP
1ec70 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  age = sqlite3Wal
1ec80 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  Dbsize(pPager->p
1ec90 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Wal);..  /* If t
1eca0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ecb0 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62   was not availab
1ecc0 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1ecd0 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a  sub-system,.  **
1ece0 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61   determine it ba
1ecf0 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20  sed on the size 
1ed00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ed10 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a  file. If the siz
1ed20 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61  e.  ** of the da
1ed30 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1ed40 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
1ed50 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
1ed60 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f  ge-size,.  ** ro
1ed70 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  und down to the 
1ed80 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 45 78  nearest page. Ex
1ed90 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c  cept, any file l
1eda0 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a  arger than 0.  *
1edb0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20  * bytes in size 
1edc0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
1edd0 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73   contain at leas
1ede0 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f  t one page..  */
1edf0 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
1ee00 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
1ee10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ee30 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
1ee40 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1ee50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1ee60 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1ee70 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1ee80 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1ee90 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  >fd) ){.      in
1eea0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
1eeb0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1eec0 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  >fd, &n);.      
1eed0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1eee0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1eef0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1ef00 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20      }.    nPage 
1ef10 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67  = (Pgno)((n+pPag
1ef20 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20  er->pageSize-1) 
1ef30 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  / pPager->pageSi
1ef40 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
1ef50 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
1ef60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1ef70 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
1ef80 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ater than the.  
1ef90 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1efa0 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1efb0 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1efc0 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1efd0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1efe0 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1eff0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1f000 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1f010 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1f020 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1f030 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70  nPage;.  }..  *p
1f040 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1f050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f060 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
1f070 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1f080 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
1f090 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
1f0a0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1f0b0 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
1f0c0 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
1f0d0 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64   exists if the d
1f0e0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1f0f0 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74  mpy, or verify t
1f100 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  hat the *-wal fi
1f110 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  le does.** not e
1f120 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e  xist (by deletin
1f130 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74  g it) if the dat
1f140 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d  abase file is em
1f150 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
1f160 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1f170 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20  t empty and the 
1f180 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1f190 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65  s, open the page
1f1a0 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65  r.** in WAL mode
1f1b0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1f1c0 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69  se is empty or i
1f1d0 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20  f no *-wal file 
1f1e0 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66  exists and.** if
1f1f0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1f200 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65  , make sure Page
1f210 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  r.journalMode is
1f220 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50   not set to.** P
1f230 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1f240 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  _WAL..**.** Retu
1f250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  rn SQLITE_OK or 
1f260 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1f270 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1f280 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52  must hold a SHAR
1f290 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
1f2a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1f2b0 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  call this.** fun
1f2c0 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61  ction. Because a
1f2d0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1f2e0 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
1f2f0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64  is required to d
1f300 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20  elete .** a WAL 
1f310 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20  on a none-empty 
1f320 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65  database, this e
1f330 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20  nsures there is 
1f340 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  no race conditio
1f350 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  n .** between th
1f360 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f  e xAccess() belo
1f370 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65  w and an xDelete
1f380 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  () being execute
1f390 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74  d by some .** ot
1f3a0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
1f3b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f3c0 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
1f3d0 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
1f3e0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1f3f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1f400 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1f410 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1f420 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f430 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1f440 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  D_LOCK || pPager
1f450 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a  ->noReadlock );.
1f460 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1f470 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
1f480 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4a0 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
1f4b0 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
1f4c0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4e0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   Size of the dat
1f4f0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
1f500 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
1f510 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
1f520 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
1f530 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f540 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1f550 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1f560 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1f570 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
1f580 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20  ger->zWal, 0);. 
1f590 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a       isWal = 0;.
1f5a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f5b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1f5c0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
1f5d0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70   pPager->pVfs, p
1f5e0 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c  Pager->zWal, SQL
1f5f0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1f600 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20  S, &isWal.      
1f610 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f630 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61  {.      if( isWa
1f640 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  l ){.        tes
1f650 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63  tcase( sqlite3Pc
1f660 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
1f670 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
1f680 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
1f690 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1f6a0 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
1f6b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1f6c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1f6d0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
1f6e0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
1f6f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1f700 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
1f710 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1f720 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
1f730 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f740 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1f750 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
1f760 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
1f770 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
1f780 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
1f790 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
1f7a0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
1f7b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
1f7c0 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
1f7d0 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
1f7e0 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
1f7f0 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
1f800 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
1f810 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
1f820 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1f830 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
1f840 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
1f850 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
1f860 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
1f870 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1f880 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
1f890 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
1f8a0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
1f8b0 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
1f8c0 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
1f8d0 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
1f8e0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
1f8f0 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
1f900 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
1f910 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
1f920 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
1f930 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
1f940 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
1f950 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
1f960 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
1f970 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
1f980 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
1f990 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
1f9a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
1f9b0 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
1f9c0 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
1f9d0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1f9e0 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
1f9f0 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
1fa00 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1fa10 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
1fa20 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
1fa30 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
1fa40 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
1fa50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1fa60 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
1fa70 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
1fa80 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
1fa90 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
1faa0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
1fab0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
1fac0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
1fad0 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
1fae0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
1faf0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
1fb00 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
1fb10 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
1fb20 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
1fb30 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
1fb40 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
1fb50 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
1fb60 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
1fb70 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
1fb80 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
1fb90 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
1fba0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
1fbb0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
1fbc0 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
1fbd0 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
1fbe0 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
1fbf0 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
1fc00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
1fc10 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
1fc20 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
1fc30 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
1fc40 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
1fc50 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
1fc60 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
1fc70 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
1fc80 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
1fc90 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
1fca0 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
1fcb0 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
1fcc0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
1fcd0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1fce0 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
1fcf0 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
1fd00 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
1fd10 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
1fd20 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
1fd30 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
1fd40 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
1fd50 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
1fd60 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
1fd70 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
1fd80 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1fd90 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
1fda0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
1fdb0 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
1fdc0 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
1fdd0 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
1fde0 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
1fdf0 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
1fe00 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
1fe10 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
1fe20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fe30 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
1fe40 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
1fe50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
1fe60 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
1fe70 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe90 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
1fea0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1feb0 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
1fec0 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
1fed0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
1fee0 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
1fef0 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
1ff00 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
1ff10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1ff20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1ff30 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
1ff40 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
1ff50 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
1ff60 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
1ff70 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
1ff80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ff90 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1ffa0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
1ffb0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1ffc0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1ffd0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
1ffe0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
1fff0 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
20000 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
20010 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
20020 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
20030 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
20040 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
20050 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
20060 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
20070 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
20080 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20090 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
200a0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
200b0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
200c0 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
200d0 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
200e0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
200f0 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
20100 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
20110 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
20120 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
20130 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
20140 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
20150 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67  OrigSize;.  pPag
20160 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
20170 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
20180 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21  mpFile;..  if( !
20190 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61  pSavepoint && pa
201a0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
201b0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
201c0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
201d0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
201e0 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
201f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
20200 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
20210 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
20220 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
20230 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
20240 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
20250 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
20260 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
20270 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
20280 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
20290 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
202a0 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
202b0 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
202c0 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
202d0 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
202e0 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
202f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
20300 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
20310 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
20320 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a  0 || szJ==0 );..
20330 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
20340 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
20350 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
20360 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
20370 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
20380 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
20390 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
203a0 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
203b0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
203c0 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
203d0 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
203e0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
203f0 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
20400 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
20410 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
20420 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
20430 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
20440 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
20450 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
20460 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
20470 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
20480 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
20490 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
204a0 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
204b0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ( pSavepoint && 
204c0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
204d0 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72  ger) ){.    iHdr
204e0 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
204f0 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
20500 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
20510 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
20520 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20530 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
20540 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
20550 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
20560 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
20570 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
20580 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
20590 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
205a0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
205b0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
205c0 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
205d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
205e0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
205f0 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
20600 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
20610 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
20620 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
20630 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
20640 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
20650 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
20660 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
20670 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
20680 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
20690 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
206a0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
206b0 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
206c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
206d0 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
206e0 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
206f0 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
20700 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
20710 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
20720 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
20730 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
20740 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
20750 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
20760 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
20770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
20780 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
20790 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
207a0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
207b0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
207c0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
207d0 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
207e0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
207f0 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
20800 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
20810 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20820 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
20830 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
20840 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
20850 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
20860 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
20870 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
20880 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
20890 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
208a0 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
208b0 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
208c0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
208d0 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
208e0 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
208f0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
20900 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
20910 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
20920 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20930 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
20940 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
20950 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
20960 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
20970 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
20980 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20990 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
209a0 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
209b0 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
209c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
209d0 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
209e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
209f0 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
20a00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
20a10 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
20a20 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
20a30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
20a40 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
20a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
20a60 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
20a70 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
20a80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
20a90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20aa0 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f>=szJ );..  /* 
20ab0 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
20ac0 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
20ad0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
20ae0 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
20af0 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
20b00 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
20b10 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20b20 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
20b30 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
20b40 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
20b50 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
20b60 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
20b70 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
20b80 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
20b90 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
20ba0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
20bb0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
20bc0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
20bd0 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  )pSavepoint->iSu
20be0 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
20bf0 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
20c00 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
20c10 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
20c20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
20c30 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50  SavepointUndo(pP
20c40 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76  ager->pWal, pSav
20c50 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61  epoint->aWalData
20c60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
20c70 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
20c80 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
20c90 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
20ca0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
20cb0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
20cc0 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29  t( offset==(i64)
20cd0 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
20ce0 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
20cf0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20d00 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
20d10 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
20d20 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
20d30 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
20d40 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
20d50 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
20d60 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
20d70 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
20d80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20d90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20da0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
20db0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20dc0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
20dd0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
20de0 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
20df0 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
20e00 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
20e10 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
20e20 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
20e30 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
20e40 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
20e50 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
20e60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
20e70 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
20e80 20 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65   Free as much me
20e90 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
20ea0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
20eb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20ec0 50 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65  PagerShrink(Page
20ed0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
20ee0 6c 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e  lite3PcacheShrin
20ef0 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  k(pPager->pPCach
20f00 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  e);.}../*.** Adj
20f10 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
20f20 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
20f30 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
20f40 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
20f50 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
20f60 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
20f70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
20f80 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
20f90 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
20fa0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
20fb0 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
20fc0 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
20fd0 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
20fe0 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
20ff0 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
21000 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
21010 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
21020 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
21030 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
21040 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
21050 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
21060 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
21070 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
21080 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
21090 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
210a0 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
210b0 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
210c0 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
210d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
210e0 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
210f0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
21100 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
21110 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
21120 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
21130 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
21140 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
21150 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
21170 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
21180 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
21190 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
211a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
211b0 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
211c0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
211d0 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
211e0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
211f0 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
21200 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
21210 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
21220 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
21230 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
21240 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
21250 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
21260 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
21270 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
21280 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
21290 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
212a0 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
212b0 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
212c0 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
212d0 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
212f0 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
21300 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
21310 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
21320 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
21330 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
21340 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
21350 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
21360 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
21370 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
21380 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
21390 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
213a0 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
213b0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  ck..**.** The ab
213c0 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c  ove is for a rol
213d0 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  lback-journal mo
213e0 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64  de.  For WAL mod
213f0 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73  e, OFF continues
21400 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74  .** to mean that
21410 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f   no syncs ever o
21420 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65  ccur.  NORMAL me
21430 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
21440 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72   is synced.** pr
21450 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
21460 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   of checkpoint a
21470 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  nd that the data
21480 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e  base file is syn
21490 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  ced.** at the co
214a0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20  nclusion of the 
214b0 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68  checkpoint if th
214c0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
214d0 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77   of the WAL.** w
214e0 61 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  as written back 
214f0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
21500 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20  e.  But no sync 
21510 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72  operations occur
21520 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e   for.** an ordin
21530 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f  ary commit in NO
21540 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57  RMAL mode with W
21550 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20  AL.  FULL means 
21560 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20  that the WAL.** 
21570 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66  file is synced f
21580 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f  ollowing each co
21590 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20  mmit operation, 
215a0 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  in addition to t
215b0 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f  he.** syncs asso
215c0 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d  ciated with NORM
215d0 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  AL..**.** Do not
215e0 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f   confuse synchro
215f0 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53  nous=FULL with S
21600 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e  QLITE_SYNC_FULL.
21610 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
21620 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20  SYNC_FULL macro 
21630 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65  means to use the
21640 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75   MacOSX-style fu
21650 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e  ll-fsync.** usin
21660 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53  g fcntl(F_FULLFS
21670 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59  YNC).  SQLITE_SY
21680 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  NC_NORMAL means 
21690 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69  to do an.** ordi
216a0 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c  nary fsync() cal
216b0 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  l.  There is no 
216c0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
216d0 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  en SQLITE_SYNC_F
216e0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54  ULL.** and SQLIT
216f0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e  E_SYNC_NORMAL on
21700 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72   platforms other
21710 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42   than MacOSX.  B
21720 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72  ut the.** synchr
21730 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75  onous=FULL versu
21740 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f  s synchronous=NO
21750 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74  RMAL setting det
21760 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20  ermines when.** 
21770 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74  the xSync primit
21780 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e  ive is called an
21790 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  d is relevant to
217a0 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a   all platforms..
217b0 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
217c0 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
217d0 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
217e0 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
217f0 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
21800 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
21810 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
21820 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
21830 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
21840 53 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 50  SafetyLevel(.  P
21850 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
21860 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
21870 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20  r to set safety 
21880 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69  level for */.  i
21890 6e 74 20 6c 65 76 65 6c 2c 20 20 20 20 20 20 20  nt level,       
218a0 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 73       /* PRAGMA s
218b0 79 6e 63 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f  ynchronous.  1=O
218c0 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d  FF, 2=NORMAL, 3=
218d0 46 55 4c 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20  FULL */  .  int 
218e0 62 46 75 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20  bFullFsync,     
218f0 20 20 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c    /* PRAGMA full
21900 66 73 79 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62  fsync */.  int b
21910 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20 20 20  CkptFullFsync   
21920 20 2f 2a 20 50 52 41 47 4d 41 20 63 68 65 63 6b   /* PRAGMA check
21930 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20  point_fullfsync 
21940 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
21950 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65  level>=1 && leve
21960 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72  l<=3 );.  pPager
21970 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76  ->noSync =  (lev
21980 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
21990 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
219a0 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
219b0 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20  ync = (level==3 
219c0 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
219d0 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66  File) ?1:0;.  if
219e0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
219f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21a00 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  syncFlags = 0;. 
21a10 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
21a20 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
21a30 7d 65 6c 73 65 20 69 66 28 20 62 46 75 6c 6c 46  }else if( bFullF
21a40 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  sync ){.    pPag
21a50 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
21a60 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
21a70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
21a80 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
21a90 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
21aa0 20 20 7d 65 6c 73 65 20 69 66 28 20 62 43 6b 70    }else if( bCkp
21ab0 74 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20  tFullFsync ){.  
21ac0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
21ad0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21ae0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
21af0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
21b00 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21b10 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
21b20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
21b30 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
21b40 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
21b50 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
21b60 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
21b70 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
21b80 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
21b90 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
21ba0 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69  ->syncFlags;.  i
21bb0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
21bc0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
21bd0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
21be0 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e  |= WAL_SYNC_TRAN
21bf0 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a  SACTIONS;.  }.}.
21c00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
21c10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
21c20 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
21c30 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
21c40 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
21c50 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
21c60 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
21c70 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
21c80 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
21c90 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
21ca0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
21cb0 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
21cc0 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
21cd0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
21ce0 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
21cf0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
21d00 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
21d10 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
21d20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
21d30 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
21d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
21d50 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
21d60 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
21d70 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
21d80 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
21d90 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
21da0 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
21db0 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
21dc0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
21dd0 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
21de0 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
21df0 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
21e00 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
21e10 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
21e20 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
21e30 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
21e40 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
21e50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21e60 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
21e70 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
21e80 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
21e90 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
21ea0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21eb0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
21ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
21ed0 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
21ee0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
21ef0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
21f00 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
21f10 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
21f20 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
21f30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
21f40 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
21f50 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
21f60 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
21f70 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
21f80 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
21f90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
21fa0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
21fb0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
21fc0 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
21fd0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
21fe0 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
21ff0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
22000 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
22010 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
22020 7c 3d 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  |=  .#if SQLITE_
22030 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
22040 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ECTION.         
22050 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46     (pPager->vfsF
22060 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
22070 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f  _FILEPROTECTION_
22080 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20  MASK)|.#endif.  
22090 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
220a0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
220b0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
220c0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
220d0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
220e0 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
220f0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
22100 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c  LOSE;.  rc = sql
22110 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65  ite3OsOpen(pPage
22120 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c  r->pVfs, 0, pFil
22130 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b  e, vfsFlags, 0);
22140 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
22150 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
22160 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72  en(pFile) );.  r
22170 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22180 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
22190 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
221a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
221b0 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75  r invokes the bu
221c0 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71  sy-handler if sq
221d0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65  lite3OsLock() re
221e0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
221f0 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e  _BUSY when tryin
22200 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
22210 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53  m no-lock to a S
22220 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f  HARED lock,.** o
22230 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  r when trying to
22240 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
22250 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
22260 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a   an EXCLUSIVE .*
22270 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20  * lock. It does 
22280 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65  *not* invoke the
22290 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
222a0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
222b0 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52  m.** SHARED to R
222c0 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e  ESERVED, or when
222d0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20   upgrading from 
222e0 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53  SHARED to EXCLUS
222f0 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63  IVE.** (which oc
22300 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d  curs during hot-
22310 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
22320 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a  ). Summary:.**.*
22330 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20  *   Transition  
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20        | Invokes 
22360 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20  xBusyHandler.** 
22370 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
22380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
223a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
223b0 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e  NO_LOCK       ->
223c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
223d0 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41    | Yes.**   SHA
223e0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45  RED_LOCK   -> RE
223f0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c  SERVED_LOCK    |
22400 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f   No.**   SHARED_
22410 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53  LOCK   -> EXCLUS
22420 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a  IVE_LOCK   | No.
22430 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f  **   RESERVED_LO
22440 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f  CK -> EXCLUSIVE_
22450 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a  LOCK   | Yes.**.
22460 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68  ** If the busy-h
22470 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
22480 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
22490 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  , the lock is .*
224a0 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74  * retried. If it
224b0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74   returns zero, t
224c0 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42  hen the SQLITE_B
224d0 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  USY error is.** 
224e0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
224f0 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61  caller of the pa
22500 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
22510 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22520 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
22530 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
22540 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22560 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
22570 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
22580 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20  dler)(void *),  
22590 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
225a0 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
225b0 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
225c0 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
225d0 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20  erArg           
225e0 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
225f0 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73   to pass to xBus
22600 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20  yHandler */.){  
22610 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
22620 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
22630 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
22640 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
22650 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
22660 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  Arg;.}../*.** Ch
22670 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
22680 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
22690 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
226a0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
226b0 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
226c0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
226d0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
226e0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
226f0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
22700 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22710 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
22720 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
22730 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
22740 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
22750 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
22760 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
22770 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
22780 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
22790 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
227a0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
227b0 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
227c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
227d0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
227e0 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
227f0 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
22800 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
22810 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
22820 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
22830 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
22840 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
22850 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
22860 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
22870 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
22880 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
22890 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
228a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
228b0 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
228c0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
228d0 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
228e0 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
228f0 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
22900 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
22910 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
22920 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
22930 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
22940 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
22950 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
22960 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
22970 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
22980 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
22990 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
229a0 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
229b0 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
229c0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
229d0 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
229e0 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
229f0 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
22a00 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
22a10 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
22a20 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
22a30 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
22a40 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
22a50 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
22a60 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
22a70 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
22a80 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
22a90 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
22aa0 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
22ab0 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
22ac0 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
22ad0 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
22ae0 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
22af0 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
22b00 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
22b10 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
22b20 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
22b30 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
22b40 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
22b50 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
22b60 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
22b70 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
22b80 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
22b90 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
22ba0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
22bb0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
22bc0 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
22bd0 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
22be0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22bf0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
22c00 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
22c10 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
22c20 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
22c30 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
22c40 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
22c50 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
22c60 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
22c70 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
22c80 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
22c90 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
22ca0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
22cb0 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
22cc0 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
22cd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
22ce0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
22cf0 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
22d00 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
22d10 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
22d20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
22d30 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
22d40 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
22d50 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
22d60 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
22d70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
22d80 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
22d90 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
22da0 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
22db0 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
22dc0 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
22dd0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
22de0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
22df0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
22e00 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
22e10 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
22e20 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
22e30 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
22e40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
22e50 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
22e60 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
22e70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
22e80 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
22e90 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
22ea0 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
22eb0 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
22ec0 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
22ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22ee0 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
22ef0 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
22f00 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
22f10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
22f20 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
22f30 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
22f40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22f50 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
22f60 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
22f70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
22f80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22f90 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
22fa0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
22fb0 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
22fc0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
22fd0 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49  pNew ) rc = SQLI
22fe0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
22ff0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23010 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
23020 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
23030 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e  r->dbSize = (Pgn
23040 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69  o)((nByte+pageSi
23050 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b  ze-1)/pageSize);
23060 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
23070 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
23080 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
23090 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
230a0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
230b0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
230c0 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
230d0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
230e0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
230f0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
23100 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
23110 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65   }..  *pPageSize
23120 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
23130 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ize;.  if( rc==S
23140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23150 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
23160 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
23170 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
23180 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
23190 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
231a0 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
231b0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
231c0 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
231d0 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
231e0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
231f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23200 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
23210 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
23220 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
23230 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
23240 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
23250 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
23260 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
23270 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
23280 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
23290 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
232a0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
232b0 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
232c0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
232d0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
232e0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
232f0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
23300 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
23310 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
23320 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
23330 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
23340 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
23350 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
23360 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
23370 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
23380 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
23390 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
233a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
233b0 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
233c0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
233d0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
233e0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
233f0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
23400 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
23410 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
23420 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
23430 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
23440 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
23450 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
23460 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
23470 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
23480 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
23490 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
234a0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
234b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
234c0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
234d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
234e0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
234f0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
23500 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
23510 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
23520 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
23530 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
23540 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23550 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
23560 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
23570 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
23580 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
23590 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
235a0 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
235b0 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
235c0 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
235d0 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
235e0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
235f0 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
23600 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
23610 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
23620 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
23630 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
23640 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
23650 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
23660 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
23670 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
23680 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
23690 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
236a0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
236b0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
236c0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
236d0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
236e0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
236f0 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
23700 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
23710 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
23720 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
23730 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
23740 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
23750 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
23760 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
23770 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
23780 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
23790 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
237a0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
237b0 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
237c0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
237d0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
237e0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
237f0 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
23800 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
23810 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
23820 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
23830 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
23840 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
23850 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
23860 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
23870 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
23880 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
23890 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
238a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
238b0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
238c0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
238d0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
238e0 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
238f0 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
23900 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
23910 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
23920 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
23930 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
23940 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
23950 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
23960 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
23970 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
23980 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
23990 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
239a0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
239b0 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
239c0 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
239d0 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
239e0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
239f0 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
23a00 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
23a10 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
23a20 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
23a30 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
23a40 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
23a50 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
23a60 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
23a70 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
23a80 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
23a90 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
23aa0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
23ab0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
23ac0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
23ad0 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
23ae0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
23af0 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
23b00 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
23b10 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
23b20 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
23b30 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23b40 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
23b50 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
23b60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23b70 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
23b80 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
23b90 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
23ba0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
23bb0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
23bc0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
23bd0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
23be0 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
23bf0 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
23c00 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
23c10 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
23c20 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
23c30 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
23c40 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
23c50 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
23c60 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
23c70 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
23c80 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
23c90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23ca0 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
23cb0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
23cc0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
23cd0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
23ce0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
23cf0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
23d00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
23d10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
23d20 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
23d30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23d40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23d50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23d60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
23d70 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
23d80 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
23d90 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
23da0 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
23db0 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
23dc0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
23dd0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
23de0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
23df0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
23e00 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
23e10 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
23e20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
23e30 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
23e40 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
23e50 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
23e60 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
23e70 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
23e80 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
23e90 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
23ea0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
23eb0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
23ec0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23ed0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
23ee0 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
23ef0 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
23f00 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
23f10 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
23f20 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
23f30 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
23f40 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
23f50 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
23f60 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
23f70 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
23f80 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
23f90 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
23fa0 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
23fb0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
23fc0 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
23fd0 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
23fe0 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
23ff0 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
24000 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
24010 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
24020 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
24030 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
24040 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
24050 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
24060 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
24070 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
24080 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
24090 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
240a0 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
240b0 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
240c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
240d0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
240e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
240f0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
24100 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
24110 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
24120 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
24130 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
24140 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
24150 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
24160 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
24170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24180 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
24190 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
241a0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
241b0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
241e0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
241f0 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
24200 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
24210 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
24220 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
24230 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
24240 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
24250 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
24260 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
24270 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
24280 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
24290 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
242a0 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
242b0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
242c0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
242d0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
242e0 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
242f0 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
24300 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
24310 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
24320 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
24330 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
24340 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
24350 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
24360 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
24370 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
24380 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
24390 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
243a0 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
243b0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
243c0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
243d0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
243e0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
243f0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
24400 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24410 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
24420 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24430 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
24440 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
24450 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
24460 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
24470 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
24480 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
24490 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
244a0 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
244b0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
244c0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
244d0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
244e0 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
244f0 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
24500 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
24510 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
24520 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
24530 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
24540 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
24550 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
24560 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
24570 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
24580 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
24590 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
245a0 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
245b0 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
245c0 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
245d0 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
245e0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
245f0 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
24600 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
24610 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
24620 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
24630 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
24640 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
24650 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
24660 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
24670 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
24680 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
24690 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
246a0 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
246b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
246c0 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
246d0 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
246e0 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
246f0 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
24700 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
24710 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77  rect behaviour w
24720 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
24730 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
24740 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
24750 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
24760 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
24770 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
24780 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
24790 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
247a0 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
247b0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
247c0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
247d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
247e0 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
247f0 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
24800 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
24810 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
24820 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
24830 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
24840 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
24850 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
24860 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
24870 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
24880 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
24890 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
248a0 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
248b0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
248c0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
248d0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
248e0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
248f0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
24900 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
24910 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
24920 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
24930 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
24940 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
24950 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
24960 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
24970 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
24980 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
24990 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
249a0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
249b0 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
249c0 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
249d0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
249e0 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
249f0 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
24a00 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
24a10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
24a20 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
24a30 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
24a40 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
24a50 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
24a60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24a70 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
24a80 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
24a90 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
24aa0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
24ab0 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
24ac0 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
24ad0 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
24ae0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
24af0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
24b00 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
24b10 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
24b20 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
24b30 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
24b40 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
24b50 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
24b60 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
24b70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
24b80 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
24b90 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
24ba0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
24bb0 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63  e;.  assertTrunc
24bc0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
24bd0 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ager);.}.../*.**
24be0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
24bf0 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
24c00 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
24c10 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
24c20 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
24c30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
24c40 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
24c50 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
24c60 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
24c70 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
24c80 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
24c90 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
24ca0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
24cb0 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
24cc0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
24cd0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
24ce0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
24cf0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
24d00 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
24d10 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
24d20 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
24d30 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
24d40 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
24d50 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
24d60 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
24d70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
24d80 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
24d90 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
24da0 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
24db0 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
24dc0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
24dd0 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
24de0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
24df0 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
24e00 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
24e10 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
24e20 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
24e30 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
24e40 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
24e50 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
24e60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
24e70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24e80 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
24e90 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
24ea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24eb0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
24ec0 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
24ed0 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
24ee0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24ef0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
24f00 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
24f10 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
24f20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
24f30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
24f50 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
24f60 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
24f70 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
24f80 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
24f90 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
24fa0 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
24fb0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
24fc0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
24fd0 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
24fe0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
24ff0 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
25000 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
25010 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
25020 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
25030 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
25040 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
25050 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
25060 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
25070 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
25080 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
25090 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
250a0 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
250b0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
250c0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
250d0 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
250e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
250f0 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
25100 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
25110 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
25120 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
25130 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
25140 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
25150 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
25160 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
25170 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
25180 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
25190 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
251a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
251b0 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
251c0 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54  Pager){.  u8 *pT
251d0 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  mp = (u8 *)pPage
251e0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20  r->pTmpSpace;.. 
251f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
25200 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
25210 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65  er) );.  disable
25220 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25230 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
25240 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
25250 6f 63 28 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  oc();.  /* pPage
25260 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20  r->errCode = 0; 
25270 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  */.  pPager->exc
25280 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
25290 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
252a0 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65  MIT_WAL.  sqlite
252b0 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72  3WalClose(pPager
252c0 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ->pWal, pPager->
252d0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70  ckptSyncFlags, p
252e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
252f0 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72   pTmp);.  pPager
25300 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64  ->pWal = 0;.#end
25310 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  if.  pager_reset
25320 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
25330 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
25340 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
25350 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25360 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e  /* If it is open
25370 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
25380 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  al file before c
25390 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64  alling UnlockAnd
253a0 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a  Rollback..    **
253b0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
253c0 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e  done, then an un
253d0 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
253e0 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
253f0 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  al .    ** file 
25400 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61  may be played ba
25410 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
25420 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
25430 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
25440 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68  .    ** while th
25450 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c  is is happening,
25460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
25470 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
25480 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  pt..    **.    *
25490 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
254a0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
254b0 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f  g to sync the jo
254c0 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65  urnal, shift the
254d0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e   pager.    ** in
254e0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
254f0 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  te. This causes 
25500 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
25510 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  k to unlock the.
25520 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
25530 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f  and close the jo
25540 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f  urnal file witho
25550 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ut attempting to
25560 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20   roll it.    ** 
25570 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65  back or finalize
25580 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61   it. The next da
25590 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c  tabase user will
255a0 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d   have to do hot-
255b0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72  journal.    ** r
255c0 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61  ollback before a
255d0 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
255e0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
255f0 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  */.    if( isOpe
25600 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
25610 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
25620 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65  ror(pPager, page
25630 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
25640 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
25650 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
25660 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
25670 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
25680 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
25690 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
256a0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
256b0 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
256c0 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
256d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
256e0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
256f0 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
25700 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
25710 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
25720 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  d);.  sqlite3OsC
25730 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
25740 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
25750 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c  ree(pTmp);.  sql
25760 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
25770 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
25780 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
25790 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
257a0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
257b0 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
257c0 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
257d0 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66  >pCodec);.#endif
257e0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
257f0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
25800 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
25810 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
25820 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
25830 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
25840 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
25850 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
25860 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
25870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25880 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
25890 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
258a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
258b0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
258c0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
258d0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
258e0 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
258f0 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
25900 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
25910 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
25920 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
25930 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
25940 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
25950 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
25960 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
25970 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
25980 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
25990 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
259a0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
259b0 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
259c0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
259d0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
259e0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
259f0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
25a00 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
25a10 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
25a20 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
25a30 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
25a40 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
25a50 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
25a60 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
25a70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
25a80 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
25a90 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
25aa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
25ab0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
25ac0 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
25ad0 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
25ae0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
25af0 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a  -mode and the .*
25b00 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  * device charact
25b10 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
25b20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
25b30 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
25b40 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
25b50 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
25b60 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
25b70 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
25b80 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
25b90 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
25ba0 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
25bb0 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
25bc0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
25bd0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
25be0 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
25bf0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
25c00 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
25c10 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
25c20 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
25c30 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
25c40 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
25c50 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
25c60 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
25c70 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
25c80 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
25c90 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
25ca0 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
25cb0 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
25cc0 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
25cd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
25ce0 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
25cf0 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
25d00 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
25d10 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
25d20 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
25d30 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
25d40 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
25d50 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
25d60 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
25d70 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
25d80 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
25d90 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
25da0 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
25db0 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
25dc0 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
25dd0 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
25de0 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
25df0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
25e00 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
25e10 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
25e20 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
25e30 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
25e40 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
25e50 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
25e60 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75     }.**.** If su
25e70 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
25e80 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
25e90 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
25ea0 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
25eb0 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
25ec0 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
25ed0 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
25ee0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
25ef0 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
25f00 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
25f10 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
25f20 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
25f30 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
25f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25f50 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
25f60 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
25f70 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63  ewHdr){.  int rc
25f80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25fa0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
25fb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
25fc0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
25fd0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
25fe0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
25ff0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
26000 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
26010 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
26020 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
26030 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
26040 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
26050 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ager) );..  rc =
26060 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
26070 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
26080 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
26090 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
260a0 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
260b0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
260c0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
260d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
260e0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
260f0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
26100 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
26110 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
26120 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
26130 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
26140 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
26150 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
26160 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
26170 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26180 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26190 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
261a0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
261b0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
261c0 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
261d0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
261e0 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
261f0 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
26200 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
26210 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
26220 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
26230 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
26240 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
26250 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
26260 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
26270 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
26280 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
26290 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
262a0 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
262b0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
262c0 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
262d0 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
262e0 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
262f0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
26300 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
26310 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
26320 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
26330 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
26340 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
26350 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
26360 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
26370 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
26380 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
26390 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
263a0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
263b0 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
263c0 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
263d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
263e0 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
263f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
26400 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
26410 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
26420 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
26430 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
26440 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
26450 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
26460 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
26470 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
26480 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
26490 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
264a0 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
264b0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
264c0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
264d0 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
264e0 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
264f0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
26500 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
26510 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
26520 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
26530 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
26540 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26550 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
26560 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
26570 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
26580 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
26590 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
265a0 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
265b0 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
265c0 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
265d0 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
265e0 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
265f0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
26600 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
26610 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
26620 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
26630 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
26640 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
26650 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
26660 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
26670 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
26680 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
26690 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
266a0 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
266b0 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
266c0 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
266d0 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
266e0 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
266f0 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
26700 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
26710 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
26720 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
26730 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
26740 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
26750 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
26760 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
26770 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
26780 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
26790 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
267a0 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
267b0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
267c0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
267d0 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
267e0 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
267f0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
26800 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
26810 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
26820 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
26830 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
26840 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
26850 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26860 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
26870 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
26880 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
26890 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
268a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
268b0 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
268c0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
268d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
268e0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
268f0 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
26900 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26910 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
26920 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
26930 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
26940 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
26950 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26960 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
26970 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
26980 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
26990 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
269a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
269b0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
269c0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
269d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
269e0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
269f0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
26a00 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
26a10 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
26a20 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
26a30 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
26a40 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
26a50 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
26a60 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
26a70 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
26a80 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
26a90 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
26aa0 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
26ab0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
26ac0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
26ad0 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
26ae0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
26af0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
26b00 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
26b10 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
26b20 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
26b30 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
26b40 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
26b50 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
26b60 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
26b70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
26b80 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
26b90 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
26ba0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
26bb0 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
26bc0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
26bd0 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
26be0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
26bf0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
26c00 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
26c10 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
26c20 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
26c30 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
26c40 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
26c50 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
26c60 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
26c70 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
26c80 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
26c90 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
26ca0 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
26cb0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
26cc0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26cd0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
26ce0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
26cf0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
26d00 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
26d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
26d20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
26d30 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
26d40 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
26d50 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
26d60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
26d70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
26d80 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
26d90 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
26da0 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
26db0 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
26dc0 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
26dd0 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
26de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
26df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
26e00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
26e10 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
26e20 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
26e30 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
26e40 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
26e50 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
26e60 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
26e70 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
26e80 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
26e90 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
26ea0 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
26eb0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
26ec0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
26ed0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20  ger->syncFlags| 
26ee0 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
26ef0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53  er->syncFlags==S
26f00 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
26f10 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
26f20 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
26f30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
26f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
26f50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26f60 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
26f70 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
26f80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
26f90 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
26fa0 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
26fb0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
26fc0 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
26fd0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
26fe0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
26ff0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
27000 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
27010 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27020 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
27040 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
27050 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
27060 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
27070 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
27080 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
27090 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
270a0 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
270b0 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
270c0 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
270d0 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
270e0 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
270f0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
27100 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
27110 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
27120 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27130 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
27140 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
27150 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
27160 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
27170 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
27180 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
27190 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
271a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
271b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
271c0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
271d0 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
271e0 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
271f0 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
27200 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
27210 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
27220 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
27230 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
27240 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
27250 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
27260 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
27270 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
27280 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
27290 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
272a0 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
272b0 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
272c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
272d0 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
272e0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
272f0 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
27300 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
27310 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
27320 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
27330 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
27340 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
27350 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
27360 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
27370 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
27380 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
27390 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
273a0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
273b0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
273c0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
273d0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
273e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
273f0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
27400 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
27410 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
27420 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
27430 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
27440 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
27450 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
27460 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
27470 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
27480 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
27490 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
274a0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
274b0 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
274c0 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
274d0 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
274e0 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
274f0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
27500 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
27510 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
27520 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
27530 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
27540 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
27550 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
27560 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
27570 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
27580 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
27590 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
275a0 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
275b0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
275c0 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
275d0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
275e0 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
275f0 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
27600 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
27610 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
27620 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
27630 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
27640 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
27650 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
27660 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
27670 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
27680 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
27690 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
276a0 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
276b0 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
276c0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
276d0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
276e0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
276f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
27700 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
27710 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
27720 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
27730 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
27740 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
27750 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
27760 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
27770 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
27780 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
27790 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
277a0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
277b0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
277c0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
277d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
277e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277f0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
27800 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
27810 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
27820 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
27830 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
27840 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
27850 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
27860 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
27870 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27880 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
27890 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
278a0 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
278b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
278c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
278d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
278e0 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
278f0 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
27900 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
27910 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
27920 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
27930 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
27940 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
27950 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
27960 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
27970 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
27980 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
27990 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
279a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
279b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
279c0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
279d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
279e0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
279f0 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
27a00 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
27a10 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
27a20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
27a30 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  s);.  }..  /* Be
27a40 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
27a50 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
27a60 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
27a70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
27a80 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
27a90 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  be..  */.  asser
27aa0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
27ab0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
27ac0 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20  r->fd) );.  if( 
27ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27ae0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
27af0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
27b00 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ze ){.    sqlite
27b10 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
27b20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27b30 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
27b40 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
27b50 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
27b60 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
27b70 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
27b80 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
27b90 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
27ba0 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
27bb0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
27bc0 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68  bSize;.  }..  wh
27bd0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
27be0 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
27bf0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
27c00 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
27c10 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
27c20 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
27c30 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
27c40 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
27c50 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
27c60 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
27c70 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
27c80 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
27c90 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
27ca0 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
27cb0 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
27cc0 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
27cd0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
27ce0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
27cf0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
27d00 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
27d10 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
27d20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
27d30 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
27d40 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
27d50 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
27d60 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
27d70 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
27d80 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
27d90 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
27da0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
27db0 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
27dc0 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
27dd0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
27de0 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
27df0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
27e00 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
27e10 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
27e20 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
27e30 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
27e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e60 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
27e70 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
27e80 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d   assert( (pList-
27e90 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
27ea0 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
27eb0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
27ec0 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
27ed0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
27ee0 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20  er(pList);..    
27ef0 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
27f00 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
27f10 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
27f20 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
27f30 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
27f40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
27f50 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
27f60 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
27f70 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
27f80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
27f90 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
27fa0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
27fb0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
27fc0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
27fd0 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
27fe0 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
27ff0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
28000 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
28010 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
28020 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
28030 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
28040 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
28050 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
28060 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
28070 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
28080 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
28090 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
280a0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
280b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
280c0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
280d0 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
280e0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
280f0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
28100 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28110 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
28120 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
28130 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
28140 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
28150 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
28160 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
28170 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
28180 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
28190 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
281a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
281b0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
281c0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
281d0 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
281e0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
281f0 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
28200 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
28210 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
28230 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
28240 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
28250 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
28260 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
28270 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
28280 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
28290 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
282a0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
282b0 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
282c0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
282d0 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
282e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
282f0 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
28300 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
28310 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28320 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
28330 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
28340 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
28350 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
28360 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
28370 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28380 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
28390 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  at the sub-journ
283a0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  al file is open.
283b0 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
283c0 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a  y open, this .**
283d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
283e0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
283f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
28400 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
28410 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
28420 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53  o plan. An .** S
28430 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
28440 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
28450 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
28460 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
28470 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  n() .** fails..*
28480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
28490 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
284a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
284b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
284c0 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
284d0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
284e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
284f0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
28500 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
28510 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
28520 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
28530 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
28540 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
28550 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20  ager->sjfd);.   
28560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
28570 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
28580 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
28590 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >sjfd, SQLITE_OP
285a0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
285b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
285c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
285d0 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
285e0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
285f0 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
28600 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
28610 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74  nal. .** It is t
28620 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
28630 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65  nsibility to use
28640 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
28650 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a  e() to check .**
28660 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c   that it is real
28670 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ly required befo
28680 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
28690 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
286a0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
286b0 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
286c0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
286d0 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
286e0 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
286f0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
28700 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
28710 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
28720 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
28730 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
28740 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
28750 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
28760 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
28770 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
28780 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
28790 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
287a0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
287b0 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
287c0 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
287d0 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
287e0 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
287f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
28800 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
28810 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
28820 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28830 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
28840 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
28850 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
28860 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
28870 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
28880 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  {..    /* Open t
28890 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
288a0 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
288b0 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
288c0 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
288d0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
288e0 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
288f0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
28900 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55  ->jfd) || pagerU
28910 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
28920 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
28930 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
28940 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75  ) || pPager->nSu
28950 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  bRec==0 );.    a
28960 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
28970 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  al(pPager) .    
28980 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f       || pageInJo
28990 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20  urnal(pPg) .    
289a0 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e       || pPg->pgn
289b0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
289c0 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20  Size .    );.   
289d0 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
289e0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20  rnal(pPager);.. 
289f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
28a00 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65  -journal was ope
28a10 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
28a20 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79   (or was already
28a30 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77   open),.    ** w
28a40 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
28a50 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
28a60 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69   file.  */.    i
28a70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28a80 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
28a90 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
28aa0 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  ta;.      i64 of
28ab0 66 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67  fset = (i64)pPag
28ac0 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70  er->nSubRec*(4+p
28ad0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
28ae0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
28af0 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43  ata2;.  .      C
28b00 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
28b10 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
28b20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
28b30 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
28b40 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
28b50 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
28b60 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
28b70 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
28b80 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
28b90 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
28ba0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
28bb0 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
28bc0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
28bd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28be0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
28bf0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
28c00 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
28c10 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
28c20 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
28c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28c40 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
28c50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
28c60 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
28c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28c80 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
28c90 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
28ca0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
28cb0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
28cc0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
28cd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28ce0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28cf0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
28d00 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
28d10 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
28d20 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
28d30 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
28d40 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
28d50 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
28d60 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
28d70 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
28d80 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
28d90 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
28da0 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
28db0 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
28dc0 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
28dd0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
28de0 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
28df0 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
28e00 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
28e10 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
28e20 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
28e30 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
28e40 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
28e50 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
28e60 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
28e70 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
28e80 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
28e90 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
28ea0 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
28eb0 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
28ec0 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
28ed0 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
28ee0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28ef0 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
28f00 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
28f10 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
28f20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
28f30 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
28f40 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
28f50 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
28f60 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
28f70 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
28f80 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
28f90 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
28fa0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
28fb0 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
28fc0 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
28fd0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
28fe0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
28ff0 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
29000 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
29010 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
29020 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
29030 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
29040 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
29050 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
29060 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
29070 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
29080 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
29090 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
290a0 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
290b0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
290c0 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
290d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
290e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
290f0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
29100 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
29110 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
29120 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
29130 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e   /* The doNotSyn
29140 63 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73  cSpill flag is s
29150 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20  et during times 
29160 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e  when doing a syn
29170 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  c of.  ** journa
29180 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20  l (and adding a 
29190 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e  new header) is n
291a0 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69  ot allowed.  Thi
291b0 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  s occurs.  ** du
291c0 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71  ring calls to sq
291d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
291e0 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  ) while trying t
291f0 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70  o journal multip
29200 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65  le.  ** pages be
29210 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73  longing to the s
29220 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a  ame sector..  **
29230 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  ** The doNotS
29240 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69  pill flag inhibi
29250 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69  ts all cache spi
29260 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  lling regardless
29270 20 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a   of whether.  **
29280 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69   or not a sync i
29290 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69  s required.  Thi
292a0 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  s is set during 
292b0 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  a rollback..  **
292c0 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69  .  ** Spilling i
292d0 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65  s also prohibite
292e0 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72  d when in an err
292f0 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74  or state since t
29300 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c  hat could.  ** l
29310 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
29320 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e  corruption.   In
29330 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
29340 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74 20 0a 20  lementaton it . 
29350 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   ** is impossibl
29360 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61  e for sqlite3Pca
29370 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65  cheFetch() to be
29380 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65   called with cre
29390 61 74 65 46 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20  ateFlag==1.  ** 
293a0 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72  while in the err
293b0 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20  or state, hence 
293c0 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
293d0 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
293e0 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c  e to.  ** be cal
293f0 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72  led in the error
29400 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68   state.  Neverth
29410 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64  eless, we includ
29420 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a  e a NEVER().  **
29430 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72   test for the er
29440 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73  ror state as a s
29450 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74  afeguard against
29460 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e   future changes.
29470 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
29480 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
29490 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e) ) return SQLI
294a0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
294b0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
294c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
294d0 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
294e0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
294f0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   && (pPg->flags 
29500 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
29510 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  C)!=0 ){.    ret
29520 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29530 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
29540 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
29550 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
29560 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
29570 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
29580 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
29590 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
295a0 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
295b0 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20  sPage(pPg) ){ . 
295c0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
295d0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a  rnalPage(pPg); .
295e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
295f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29600 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
29610 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
29620 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20   pPg, 0, 0);.   
29630 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20   }.  }else{.  . 
29640 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
29650 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
29660 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
29670 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
29680 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a  GHDR_NEED_SYNC .
29690 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
296a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
296b0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
296c0 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
296d0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
296e0 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
296f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
29700 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
29710 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65  is page is large
29720 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
29730 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a  nt size of.    *
29740 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
29750 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65  mage, it may nee
29760 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  d to be written 
29770 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
29780 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  al..    ** This 
29790 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  is because the c
297a0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69  all to pager_wri
297b0 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65  te_pagelist() be
297c0 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  low will not.   
297d0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
297e0 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
297f0 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
29800 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
29810 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  Consider the fol
29820 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lowing sequence 
29830 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a  of events:.    *
29840 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e  *.    **   BEGIN
29850 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  ;.    **     <jo
29860 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20  urnal page X>.  
29870 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79    **     <modify
29880 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20   page X>.    ** 
29890 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70      SAVEPOINT sp
298a0 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c  ;.    **       <
298b0 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
298c0 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
298d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61  .    **       pa
298e0 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58  gerStress(page X
298f0 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c  ).    **     ROL
29900 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20  LBACK TO sp;.   
29910 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58   **.    ** If (X
29920 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70  >Y), then when p
29930 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61  agerStress is ca
29940 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c  lled page X will
29950 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a   not be written.
29960 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68      ** out to th
29970 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
29980 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f   but will be dro
29990 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  pped from the ca
299a0 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a  che. Then,.    *
299b0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
299c0 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
299d0 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64   statement, read
299e0 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20  ing page X will 
299f0 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61  read.    ** data
29a00 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
29a10 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69  se file. This wi
29a20 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f  ll be the copy o
29a30 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20  f page X as it. 
29a40 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74     ** was when t
29a50 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
29a60 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
29a70 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
29a80 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a  POINT sp".    **
29a90 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20   was executed.. 
29aa0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
29ab0 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
29ac0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
29ad0 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20  t data for page 
29ae0 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  X into the .    
29af0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  ** sub-journal f
29b00 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69  ile now (if it i
29b10 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68  s not already th
29b20 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74  ere), so that it
29b30 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
29b40 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
29b50 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68  current value wh
29b60 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
29b70 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20   TO sp" is .    
29b80 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  ** executed..   
29b90 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45   */.    if( NEVE
29ba0 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53  R(.        rc==S
29bb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d  QLITE_OK && pPg-
29bc0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
29bd0 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75  Size && subjRequ
29be0 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
29bf0 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20    ) ){.      rc 
29c00 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
29c10 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  (pPg);.    }.  .
29c20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
29c30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
29c40 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65   page out to the
29c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
29c60 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
29c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29c80 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
29c90 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
29ca0 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
29cb0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
29cc0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61  ite_pagelist(pPa
29cd0 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d  ger, pPg);.    }
29ce0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
29cf0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
29d00 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
29d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29d20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
29d30 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
29d40 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
29d50 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
29d60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
29d70 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
29d80 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
29d90 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
29da0 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f  ger, rc); .}.../
29db0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
29dc0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
29dd0 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
29de0 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
29df0 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
29e00 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
29e10 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
29e20 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
29e30 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
29e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
29e50 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
29e60 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
29e70 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path t
29e80 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29e90 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
29ea0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
29eb0 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
29ec0 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
29ed0 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
29ee0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
29ef0 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
29f00 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
29f10 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
29f20 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
29f30 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
29f40 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
29f50 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
29f60 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
29f70 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
29f80 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
29f90 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
29fa0 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
29fb0 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
29fc0 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
29fd0 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
29fe0 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
29ff0 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
2a000 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
2a010 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2a020 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
2a030 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
2a040 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
2a050 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
2a060 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
2a070 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
2a080 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
2a090 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
2a0a0 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ) API..**.** The
2a0b0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
2a0c0 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  is used to speci
2a0d0 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68  fy properties th
2a0e0 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a  at affect the.**
2a0f0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
2a100 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75  e pager. It shou
2a110 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d  ld be passed som
2a120 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e  e bitwise combin
2a130 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ation.** of the 
2a140 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
2a150 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f  AL and PAGER_NO_
2a160 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a  READLOCK flags..
2a170 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61  **.** The vfsFla
2a180 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  gs parameter is 
2a190 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73  a bitmask to pas
2a1a0 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70  s to the flags p
2a1b0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
2a1c0 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f  he xOpen() metho
2a1d0 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  d of the supplie
2a1e0 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69  d VFS when openi
2a1f0 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a  ng files. .**.**
2a200 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   If the pager ob
2a210 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
2a220 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  d and the specif
2a230 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ied file opened 
2a240 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
2a250 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2a260 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
2a270 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e  ager set to poin
2a280 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
2a290 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
2a2a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2a2b0 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65  , *ppPager is se
2a2c0 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64  t to NULL.** and
2a2d0 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   error code retu
2a2e0 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  rned. This funct
2a2f0 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2a300 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28  QLITE_NOMEM.** (
2a310 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20  sqlite3Malloc() 
2a320 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
2a330 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c  ate memory), SQL
2a340 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20  ITE_CANTOPEN or 
2a350 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49  .** various SQLI
2a360 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73  TE_IO_XXX errors
2a370 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a380 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c  PagerOpen(.  sql
2a390 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2a3a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
2a3b0 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  tual file system
2a3c0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67   to use */.  Pag
2a3d0 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
2a3e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
2a3f0 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
2a400 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
2a410 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a420 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
2a430 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2a440 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
2a450 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2a460 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2a470 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
2a480 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
2a490 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
2a4a0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2a4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2a4c0 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
2a4d0 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
2a4e0 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20  t vfsFlags,     
2a4f0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2a500 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
2a510 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
2a520 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20  pen() */.  void 
2a530 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
2a540 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  e*) /* Function 
2a550 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20  to reinitialize 
2a560 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  pages */.){.  u8
2a570 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
2a580 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20  *pPager = 0;    
2a590 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
2a5a0 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ct to allocate a
2a5b0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  nd return */.  i
2a5c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a5d0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
2a5e0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2a5f0 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20  tempFile = 0;   
2a600 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2a610 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63   temp files (inc
2a620 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  l. in-memory fil
2a630 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  es) */.  int mem
2a640 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Db = 0;         
2a650 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2a660 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
2a670 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2a680 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
2a690 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a6a0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
2a6b0 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
2a6c0 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
2a6d0 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
2a6e0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2a6f0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
2a700 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
2a710 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
2a720 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
2a730 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2a740 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
2a750 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
2a760 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2a770 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
2a780 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
2a790 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
2a7a0 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
2a7b0 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
2a7c0 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
2a7d0 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
2a7e0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
2a7f0 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20  O_READLOCK)!=0; 
2a800 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
2a810 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
2a820 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2a830 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2a840 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2a850 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2a860 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2a870 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2a880 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2a890 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2a8a0 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2a8b0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2a8c0 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2a8d0 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2a8e0 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2a8f0 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2a900 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2a910 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2a920 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2a930 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2a940 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2a950 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2a960 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2a970 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2a980 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2a990 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2a9a0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2a9b0 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
2a9c0 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
2a9d0 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
2a9e0 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
2a9f0 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
2aa00 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
2aa10 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
2aa20 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
2aa30 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
2aa40 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
2aa50 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
2aa60 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
2aa70 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
2aa80 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
2aa90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
2aaa0 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
2aab0 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
2aac0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2aad0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
2aae0 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
2aaf0 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
2ab00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
2ab10 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2ab20 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
2ab30 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
2ab40 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2ab50 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2ab60 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2ab70 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
2ab80 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2ab90 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2aba0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
2abb0 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
2abc0 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
2abd0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
2abe0 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
2abf0 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
2ac00 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23  *ppPager = 0;..#
2ac10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ac20 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66  IT_MEMORYDB.  if
2ac30 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ( flags & PAGER_
2ac40 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65  MEMORY ){.    me
2ac50 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 46 69  mDb = 1;.    zFi
2ac60 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
2ac70 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
2ac80 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74  pute and store t
2ac90 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
2aca0 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64   in an allocated
2acb0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
2acc0 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68    ** to by zPath
2acd0 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61  name, length nPa
2ace0 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74  thname. Or, if t
2acf0 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
2ad00 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65  ry file,.  ** le
2ad10 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61  ave both nPathna
2ad20 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65  me and zPathname
2ad30 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a   set to 0..  */.
2ad40 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2ad50 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2ad60 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2ad70 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e  r *z;.    nPathn
2ad80 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
2ad90 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
2ada0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2adb0 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  3Malloc(nPathnam
2adc0 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2add0 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2ade0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2adf0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2ae00 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2ae10 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2ae20 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2ae30 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2ae40 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2ae50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2ae60 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2ae70 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2ae80 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2ae90 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2aea0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2aeb0 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2aec0 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2aed0 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2aee0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2aef0 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2af00 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2af10 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2af20 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2af30 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2af40 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2af50 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2af60 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2af70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2af80 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2af90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2afa0 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2afb0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2afc0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2afd0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2afe0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2aff0 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2b000 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2b010 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2b020 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2b030 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2b040 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2b050 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2b060 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2b070 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2b080 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2b090 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2b0a0 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2b0b0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2b0c0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2b0d0 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2b0e0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2b0f0 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2b100 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2b110 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2b120 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2b130 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2b140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b150 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2b160 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2b170 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2b180 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
2b190 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
2b1a0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2b1b0 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65  ure, PCache obje
2b1c0 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72  ct, the.  ** thr
2b1d0 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ee file descript
2b1e0 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ors, the databas
2b1f0 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  e file name and 
2b200 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
2b210 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65  * file name. The
2b220 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72   layout in memor
2b230 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  y is as follows:
2b240 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50  .  **.  **     P
2b250 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20  ager object     
2b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2b270 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79  sizeof(Pager) by
2b280 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43  tes).  **     PC
2b290 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20  ache object     
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2b2b0 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2b2c0 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  () bytes).  **  
2b2d0 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2b2e0 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
2b2f0 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69     (pVfs->szOsFi
2b300 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  le bytes).  **  
2b310 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66     Sub-journal f
2b320 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2b330 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2b340 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2b350 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c      Main journal
2b360 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2b370 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
2b380 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
2b390 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2b3a0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2b3b0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2b3c0 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  1 bytes).  **   
2b3d0 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e    Journal file n
2b3e0 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2b3f0 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31    (nPathname+8+1
2b400 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70   bytes).  */.  p
2b410 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  Ptr = (u8 *)sqli
2b420 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
2b430 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
2b440 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20  (*pPager)) +    
2b450 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63    /* Pager struc
2b460 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ture */.    ROUN
2b470 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b  D8(pcacheSize) +
2b480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43             /* PC
2b490 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ache object */. 
2b4a0 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e     ROUND8(pVfs->
2b4b0 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20  szOsFile) +     
2b4c0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62    /* The main db
2b4d0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75   file */.    jou
2b4e0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32  rnalFileSize * 2
2b4f0 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   +          /* T
2b500 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  he two journal f
2b510 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61  iles */ .    nPa
2b520 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2b530 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a  i +         /* z
2b540 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Filename */.    
2b550 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20  nPathname + 8 + 
2b560 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2              /
2b570 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  * zJournal */.#i
2b580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b590 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74  T_WAL.    + nPat
2b5a0 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20  hname + 4 + 2   
2b5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c           /* zWal
2b5c0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   */.#endif.  );.
2b5d0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2b5e0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
2b5f0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2b600 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2b610 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
2b620 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2b630 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
2b640 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2b650 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
2b660 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
2b670 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
2b680 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
2b690 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
2b6a0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
2b6b0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2b6c0 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
2b6d0 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
2b6e0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2b6f0 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
2b700 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
2b710 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
2b720 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2b730 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2b740 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
2b750 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
2b760 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2b770 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2b780 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
2b790 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
2b7a0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
2b7b0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2b7c0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2b7d0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
2b7e0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
2b7f0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2b800 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
2b810 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
2b820 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
2b830 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
2b840 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
2b850 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74      assert( nPat
2b860 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70  hname>0 );.    p
2b870 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
2b880 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
2b890 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
2b8a0 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  1 + nUri);.    m
2b8b0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
2b8c0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
2b8d0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2b8e0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2b8f0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
2b900 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69  athname+1], zUri
2b910 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  , nUri);.    mem
2b920 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2b930 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2b940 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2b950 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2b960 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2b970 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c  ame], "-journal\
2b980 30 30 30 22 2c 20 38 2b 31 29 3b 0a 20 20 20 20  000", 8+1);.    
2b990 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2b9a0 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2b9b0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  name, pPager->zJ
2b9c0 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66  ournal);.#ifndef
2b9d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2b9e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61  .    pPager->zWa
2b9f0 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  l = &pPager->zJo
2ba00 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b  urnal[nPathname+
2ba10 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  8+1];.    memcpy
2ba20 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a  (pPager->zWal, z
2ba30 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2ba40 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2ba50 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e  (&pPager->zWal[n
2ba60 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c  Pathname], "-wal
2ba70 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20  \000", 4+1);.   
2ba80 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2ba90 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2baa0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2bab0 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Wal);.#endif.   
2bac0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
2bad0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  athname);.  }.  
2bae0 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
2baf0 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  Vfs;.  pPager->v
2bb00 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
2bb10 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  gs;..  /* Open t
2bb20 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
2bb30 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2bb40 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2bb50 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  [0] ){.    int f
2bb60 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2bb80 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
2bb90 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
2bba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2bbb0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2bbc0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2bbd0 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
2bbe0 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
2bbf0 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62    assert( !memDb
2bc00 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79   );.    readOnly
2bc10 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2bc20 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2bc30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2bc40 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2bc50 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2bc60 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2bc70 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2bc80 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2bc90 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2bca0 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2bcb0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2bcc0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2bcd0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2bce0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2bcf0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2bd00 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2bd10 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2bd20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2bd30 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2bd40 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2bd50 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2bd60 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2bd70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2bd80 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2bd90 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2bda0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bdb0 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
2bdc0 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53  ly ){.      setS
2bdd0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2bde0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2bdf0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2be00 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2be10 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2be20 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69  E_SIZE);.      i
2be30 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2be40 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2be50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2be60 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2be70 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2be80 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2be90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  ){.          szP
2bea0 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2beb0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2bec0 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2bed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2bee0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2bef0 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2bf00 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  rSize;.        }
2bf10 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
2bf20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2bf30 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2bf40 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69   {.        int i
2bf50 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2bf60 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2bf70 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2bf80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
2bf90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2bfa0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2bfb0 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2bfc0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2bfd0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2bfe0 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
2bff0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
2c000 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2c010 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2c020 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2c030 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2c040 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2c050 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2c060 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2c070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2c080 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
2c090 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
2c0a0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
2c0b0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2c0c0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
2c0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2c0e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2c0f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2c100 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2c110 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2c120 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2c130 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2c140 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2c150 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2c160 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2c170 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2c180 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2c190 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2c1a0 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2c1b0 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2c1c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2c1d0 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2c1e0 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2c1f0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2c200 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2c210 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2c220 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2c230 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2c240 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2c250 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2c260 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2c270 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2c280 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
2c290 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d   .    tempFile =
2c2a0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2c2b0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
2c2c0 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
2c2d0 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2c2e0 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
2c2f0 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2c300 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2c310 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2c320 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2c330 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2c340 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2c350 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2c360 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2c370 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2c380 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2c390 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2c3a0 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2c3b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c3c0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2c3d0 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2c3e0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2c3f0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2c400 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2c410 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2c420 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2c430 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2c440 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2c450 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2c460 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
2c470 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
2c480 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  ee the .  ** Pag
2c490 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2c4a0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2c4b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2c4c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c4d0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2c4e0 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20  ->pTmpSpace );. 
2c4f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2c500 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2c510 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c520 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2c530 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2c540 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2c550 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
2c560 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  */.  assert( nEx
2c570 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45  tra<1000 );.  nE
2c580 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2c590 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
2c5a0 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
2c5b0 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
2c5c0 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
2c5d0 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2c5e0 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2c5f0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2c600 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2c610 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
2c620 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2c630 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2c640 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2c650 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2c660 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2c670 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2c680 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2c690 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2c6a0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2c6b0 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2c6c0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
2c6d0 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f  lock = (noReadlo
2c6e0 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20  ck && readOnly) 
2c6f0 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ?1:0;.  /* pPage
2c700 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2c710 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2c720 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2c730 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2c740 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2c750 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2c760 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2c770 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2c780 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2c790 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2c7a0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2c7b0 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2c7c0 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2c7d0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2c7e0 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2c7f0 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  ; */.#if 0.  ass
2c800 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2c810 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
2c820 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
2c830 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
2c840 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ) );.#endif.  /*
2c850 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2c860 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2c870 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2c880 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2c890 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2c8a0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2c8b0 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2c8c0 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2c8d0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2c8e0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2c8f0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2c900 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2c910 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2c920 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2c930 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2c940 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2c950 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2c960 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2c970 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2c980 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2c990 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2c9a0 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2c9b0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2c9c0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2c9d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2c9e0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2c9f0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2ca00 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
2ca10 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
2ca20 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
2ca30 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2ca40 73 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  s = pPager->noSy
2ca50 6e 63 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f  nc ? 0 : SQLITE_
2ca60 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70  SYNC_NORMAL;.  p
2ca70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2ca80 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73  lags = pPager->s
2ca90 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  yncFlags;.  if( 
2caa0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2cab0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2cac0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d  ager->fullSync==
2cad0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2cae0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2caf0 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2cb00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c  ert( pPager->wal
2cb10 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2cb20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2cb30 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2cb40 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
2cb50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
2cb60 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  lSync = 1;.    p
2cb70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2cb80 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2cb90 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
2cba0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
2cbb0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2cbc0 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f  RMAL | WAL_SYNC_
2cbd0 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20  TRANSACTIONS;.  
2cbe0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
2cbf0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2cc00 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2cc10 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
2cc20 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
2cc30 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2cc40 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
2cc50 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
2cc60 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
2cc70 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
2cc80 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
2cc90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2cca0 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
2ccb0 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
2ccc0 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
2ccd0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2cce0 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
2ccf0 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
2cd00 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2cd10 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
2cd20 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
2cd30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2cd40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2cd50 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
2cd60 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
2cd70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2cd80 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2cd90 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
2cda0 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2cdb0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
2cdc0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2cdd0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
2cde0 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
2cdf0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
2ce00 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
2ce10 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2ce20 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2ce30 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2ce40 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  /..  *ppPager = 
2ce50 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
2ce60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2ce70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2ce80 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
2ce90 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69  fter transitioni
2cea0 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e  ng from PAGER_UN
2ceb0 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52  LOCK to.** PAGER
2cec0 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49  _SHARED state. I
2ced0 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65  t tests if there
2cee0 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2cef0 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20  l present in.** 
2cf00 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2cf10 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
2cf20 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ger. A hot journ
2cf30 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a  al is one that .
2cf40 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ** needs to be p
2cf50 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f  layed back. Acco
2cf60 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75  rding to this fu
2cf70 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f  nction, a hot-jo
2cf80 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78  urnal.** file ex
2cf90 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c  ists if the foll
2cfa0 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61  owing criteria a
2cfb0 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
2cfc0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2cfd0 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  le exists in the
2cfe0 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e   file system, an
2cff0 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63  d.**   * No proc
2d000 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2d010 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
2d020 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2d030 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a  base file, and.*
2d040 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61  *   * The databa
2d050 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69  se file itself i
2d060 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
2d070 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
2d080 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66  and.**   * The f
2d090 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
2d0a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2d0b0 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20  ists and is not 
2d0c0 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  0x00..**.** If t
2d0d0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
2d0e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d0f0 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
2d100 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2d110 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
2d120 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
2d130 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
2d140 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
2d150 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
2d160 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49  the same name. I
2d170 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2d180 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
2d190 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ** just deleted 
2d1a0 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20  using OsDelete, 
2d1b0 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2d1c0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2d1d0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2d1e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
2d1f0 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63  utine does not c
2d200 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  heck if there is
2d210 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2d220 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74  l filename.** at
2d230 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2d240 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
2d250 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74  s, and that mast
2d260 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  er journal file.
2d270 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
2d280 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  t, then the jour
2d290 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2d2a0 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74  really hot. In t
2d2b0 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73  his.** case this
2d2c0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
2d2d0 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  turn a false-pos
2d2e0 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72  itive. The pager
2d2f0 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72  _playback().** r
2d300 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63  outine will disc
2d310 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f  over that the jo
2d320 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
2d330 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64  t really hot and
2d340 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f   .** will not ro
2d350 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a  ll it back. .**.
2d360 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ** If a hot-jour
2d370 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  nal file is foun
2d380 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78  d to exist, *pEx
2d390 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31  ists is set to 1
2d3a0 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f   and .** SQLITE_
2d3b0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2d3c0 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  no hot-journal f
2d3d0 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ile is present, 
2d3e0 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73  *pExists is.** s
2d3f0 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
2d400 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2d410 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2d420 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2d430 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  ng.** to determi
2d440 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
2d450 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  t a hot-journal 
2d460 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65  file exists, the
2d470 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64   IO error.** cod
2d480 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2d490 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
2d4a0 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66  pExists is undef
2d4b0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
2d4c0 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
2d4d0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
2d4e0 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a   int *pExists){.
2d4f0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
2d500 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
2d510 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
2d520 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2d540 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2d550 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20  nt exists = 1;  
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d570 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61  True if a journa
2d580 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
2d590 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f  t */.  int jrnlO
2d5a0 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70  pen = !!isOpen(p
2d5b0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20  Pager->jfd);..  
2d5c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2d5d0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2d5e0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2d5f0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
2d600 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2d610 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2d620 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  EN );..  assert(
2d630 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20   jrnlOpen==0 || 
2d640 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  ( sqlite3OsDevic
2d650 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2d660 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a  (pPager->jfd) &.
2d670 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
2d680 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
2d690 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20  N_OPEN.  ));..  
2d6a0 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
2d6b0 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
2d6c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2d6d0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
2d6e0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2d6f0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
2d700 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
2d710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2d720 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
2d730 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  sts ){.    int l
2d740 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20  ocked = 0;      
2d750 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2d760 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
2d770 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2d780 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  lock */..    /* 
2d790 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68  Race condition h
2d7a0 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72  ere:  Another pr
2d7b0 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65  ocess might have
2d7c0 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68   been holding th
2d7d0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53  e.    ** the RES
2d7e0 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68  ERVED lock and h
2d7f0 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70  ave a journal op
2d800 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65  en at the sqlite
2d810 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20  3OsAccess() .   
2d820 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20   ** call above, 
2d830 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20  but then delete 
2d840 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
2d850 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65  drop the lock be
2d860 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67  fore.    ** we g
2d870 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  et to the follow
2d880 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65  ing sqlite3OsChe
2d890 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
2d8a0 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a   call.  If that.
2d8b0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61      ** is the ca
2d8c0 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
2d8d0 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65   might think the
2d8e0 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
2d8f0 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  nal when.    ** 
2d900 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73  in fact there is
2d910 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73   none.  This res
2d920 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d  ults in a false-
2d930 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77  positive which w
2d940 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65  ill.    ** be de
2d950 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20  alt with by the 
2d960 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65  playback routine
2d970 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e  .  Ticket #3883.
2d980 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2d990 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2d9a0 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
2d9b0 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
2d9c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2d9d0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b  LITE_OK && !lock
2d9e0 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  ed ){.      Pgno
2d9f0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2da00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2da10 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
2da20 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2da30 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2da40 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
2da50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2da60 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
2da70 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a  0 pages,.      *
2da80 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  * then delete th
2da90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2daa0 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
2dab0 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72  omment above for
2dac0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72   .      ** the r
2dad0 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20  easoning here.  
2dae0 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c  Delete the obsol
2daf0 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
2db00 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   under.      ** 
2db10 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2db20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f  to avoid race co
2db30 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20  nditions and to 
2db40 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a  avoid violating.
2db50 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30        ** [H33020
2db60 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ]..      */.    
2db70 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
2db80 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
2db90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2dba0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2dbb0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  {.        if( nP
2dbc0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2dbd0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
2dbe0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
2dbf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
2dc00 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
2dc10 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
2dc20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2dc30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2dc40 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
2dc50 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2dc60 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
2dc70 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2dc80 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20  exclusiveMode ) 
2dc90 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
2dca0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
2dcb0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
2dcc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2dcd0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
2dce0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
2dcf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2dd00 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2dd10 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
2dd20 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2dd30 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
2dd40 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
2dd50 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2dd60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2dd70 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
2dd80 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
2dd90 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
2dda0 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
2ddb0 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
2ddc0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2ddd0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
2dde0 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
2ddf0 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
2de00 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
2de10 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
2de20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
2de30 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
2de40 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2de50 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
2de60 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
2de70 20 20 20 20 20 69 6e 74 20 66 20 3d 20 0a 23 69       int f = .#i
2de80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2de90 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
2deb0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26  Pager->vfsFlags&
2dec0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45  SQLITE_OPEN_FILE
2ded0 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29  PROTECTION_MASK)
2dee0 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  |.#endif.       
2def0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
2df00 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
2df10 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2df20 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2df30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2df40 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2df50 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2df60 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
2df70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2df80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2df90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dfa0 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
2dfb0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2dfc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2dfd0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2dfe0 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
2dff0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
2e000 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2e010 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2e020 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
2e030 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2e040 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2e050 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e060 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2e070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e080 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2e090 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2e0a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e0b0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2e0c0 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
2e0d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2e0e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2e0f0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
2e100 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
2e110 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
2e120 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
2e130 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
2e140 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
2e150 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
2e160 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
2e170 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
2e180 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
2e190 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
2e1a0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
2e1b0 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
2e1c0 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
2e1d0 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
2e1e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
2e1f0 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
2e200 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
2e210 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2e220 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
2e230 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2e240 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
2e250 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
2e260 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
2e270 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2e280 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
2e290 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
2e2a0 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
2e2b0 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
2e2c0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
2e2d0 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
2e2e0 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
2e2f0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2e300 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
2e310 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
2e320 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
2e330 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
2e340 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2e350 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
2e360 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2e370 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2e390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e3a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2e3b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2e3c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2e3d0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
2e3e0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2e3f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2e400 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2e410 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
2e420 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
2e430 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
2e440 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
2e450 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
2e460 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
2e470 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
2e480 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
2e490 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2e4a0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2e4b0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2e4c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
2e4d0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
2e4e0 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
2e4f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2e500 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
2e510 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
2e520 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
2e530 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
2e540 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
2e550 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e560 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
2e570 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
2e580 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
2e590 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
2e5a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e5b0 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
2e5c0 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
2e5d0 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
2e5e0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
2e5f0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
2e600 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
2e610 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
2e620 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
2e630 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
2e640 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
2e650 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
2e660 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
2e670 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
2e680 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
2e690 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
2e6a0 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
2e6b0 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
2e6c0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2e6d0 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
2e6e0 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
2e6f0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
2e700 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
2e710 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
2e720 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2e730 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2e740 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
2e750 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
2e760 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
2e770 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2e780 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
2e790 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
2e7a0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
2e7b0 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
2e7c0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2e7d0 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
2e7e0 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
2e7f0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
2e800 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2e810 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
2e820 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
2e830 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
2e840 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
2e850 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2e860 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2e870 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2e880 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2e890 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
2e8a0 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
2e8b0 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
2e8c0 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
2e8d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
2e8e0 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
2e8f0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
2e900 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2e910 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2e920 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2e930 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
2e940 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2e950 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e960 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2e970 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2e980 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
2e990 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
2e9a0 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
2e9b0 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
2e9c0 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
2e9d0 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
2e9e0 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
2e9f0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
2ea00 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
2ea10 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
2ea20 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
2ea30 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
2ea40 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
2ea50 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
2ea60 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
2ea70 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f  ccess mode..  */
2ea80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ea90 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2eaa0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2eab0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
2eac0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2ead0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2eae0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2eaf0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2eb00 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
2eb10 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
2eb20 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45  ADER );.  if( NE
2eb30 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
2eb40 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
2eb50 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2eb60 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66  errCode; }..  if
2eb70 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2eb80 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
2eb90 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2eba0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
2ebb0 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
2ebc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2ebd0 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
2ebe0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
2ebf0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
2ec00 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
2ec10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ec20 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30  r->noReadlock==0
2ec30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 72 65 61 64   || pPager->read
2ec40 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20 20 69 66 28  Only );..    if(
2ec50 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
2ec60 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
2ec70 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
2ec80 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
2ec90 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2eca0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ecb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ecc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ecd0 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
2ece0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
2ecf0 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
2ed00 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
2ed10 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2ed20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2ed30 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
2ed40 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
2ed50 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
2ed60 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
2ed70 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2ed80 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
2ed90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2eda0 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
2edb0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
2edc0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
2edd0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
2ede0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
2edf0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
2ee00 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
2ee10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ee20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ee30 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
2ee40 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
2ee50 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
2ee60 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
2ee70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2ee80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2ee90 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
2eea0 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
2eeb0 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
2eec0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
2eed0 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
2eee0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
2eef0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
2ef00 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2ef10 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
2ef20 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
2ef30 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
2ef40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2ef50 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
2ef60 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
2ef70 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
2ef80 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
2ef90 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
2efa0 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
2efb0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
2efc0 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
2efd0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
2efe0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
2eff0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
2f000 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
2f010 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2f020 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
2f030 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
2f040 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
2f050 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
2f060 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
2f070 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
2f080 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
2f090 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
2f0a0 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
2f0b0 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
2f0c0 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
2f0d0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
2f0e0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
2f0f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
2f100 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
2f110 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2f120 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  =exclusive mode,
2f130 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20   the lock is.   
2f140 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64     ** downgraded
2f150 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   to SHARED_LOCK 
2f160 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
2f170 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
2f180 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2f190 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
2f1a0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
2f1b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2f1c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f1d0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
2f1e0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2f1f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20  .      /* If it 
2f200 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
2f210 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65  pen and the file
2f220 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
2f230 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
2f240 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20   ** journal for 
2f250 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2f260 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20  s. Write access 
2f270 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
2f280 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  use .      ** in
2f290 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
2f2a0 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
2f2b0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
2f2c0 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20  be kept open .  
2f2d0 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69      ** and possi
2f2e0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
2f2f0 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
2f300 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65   on. Also, write
2f310 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a  -access .      *
2f320 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71  * is usually req
2f330 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a  uired to finaliz
2f340 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e  e the journal in
2f350 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65   journal_mode=pe
2f360 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rsist .      ** 
2f370 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66  mode (and also f
2f380 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
2f390 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65  truncate on some
2f3a0 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20   systems)..     
2f3b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
2f3c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
2f3d0 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
2f3e0 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
2f3f0 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a  t some .      **
2f400 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2f410 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
2f420 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
2f430 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
2f440 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65     ** this conne
2f450 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74  ction obtained t
2f460 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
2f470 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20  k above. Or, it 
2f480 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65  .      ** may me
2f490 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
2f4a0 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
2f4b0 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
2f4c0 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
2f4d0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2f4e0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2f4f0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
2f500 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
2f510 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
2f520 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2f530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2f540 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2f550 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2f560 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78  .        int bEx
2f570 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
2f580 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
2f590 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f5a0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
2f5b0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
2f5c0 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s(.            p
2f5d0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2f5e0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2f5f0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45  CESS_EXISTS, &bE
2f600 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20  xists);.        
2f610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f620 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
2f630 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
2f640 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
2f650 20 20 69 6e 74 20 66 20 3d 20 0a 23 69 66 20 53    int f = .#if S
2f660 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
2f670 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
2f680 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
2f690 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54  ->vfsFlags&SQLIT
2f6a0 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45  E_OPEN_FILEPROTE
2f6b0 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e  CTION_MASK)|.#en
2f6c0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
2f6d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f6e0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
2f6f0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
2f700 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2f710 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
2f720 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
2f730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
2f740 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
2f750 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
2f760 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
2f770 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
2f780 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2f790 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
2f7a0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
2f7b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2f7c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
2f7d0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
2f7e0 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
2f7f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f800 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2f810 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2f820 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2f830 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
2f840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2f850 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
2f860 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
2f870 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2f880 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
2f890 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
2f8a0 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
2f8b0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
2f8c0 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68  d lock. Purge th
2f8d0 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20  e cache before. 
2f8e0 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20       ** playing 
2f8f0 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75  back the hot-jou
2f900 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20  rnal so that we 
2f910 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74  don't end up wit
2f920 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  h.      ** an in
2f930 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
2f940 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20  .  Sync the hot 
2f950 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
2f960 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  laying.      ** 
2f970 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68  it back since th
2f980 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
2f990 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20  rashed and left 
2f9a0 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a  the hot journal.
2f9b0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
2f9c0 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69  y did not sync i
2f9d0 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71  t and we are req
2f9e0 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20  uired to always 
2f9f0 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68  sync.      ** th
2fa00 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
2fa10 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
2fa20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2fa30 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
2fa40 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2fa50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2fa60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2fa70 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
2fa80 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
2fa90 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
2faa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2fac0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
2fad0 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
2fae0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2faf0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
2fb00 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  PEN;.        }. 
2fb10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
2fb20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2fb30 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  eMode ){.       
2fb40 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
2fb50 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
2fb60 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  CK);.      }..  
2fb70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2fb80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2fb90 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2fba0 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65  is taken if an e
2fbb0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2fbc0 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  e trying to open
2fbd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72  .        ** or r
2fbe0 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  oll back a hot-j
2fbf0 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c  ournal while hol
2fc00 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
2fc10 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
2fc20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c      ** pager_unl
2fc30 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ock() routine wi
2fc40 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  ll be called bef
2fc50 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  ore returning to
2fc60 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20   unlock.        
2fc70 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  ** the file. If 
2fc80 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d  the unlock attem
2fc90 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50  pt fails, then P
2fca0 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20  ager.eLock must 
2fcb0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  be.        ** se
2fcc0 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
2fcd0 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  K (see the comme
2fce0 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
2fcf0 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20  fine for .      
2fd00 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43    ** UNKNOWN_LOC
2fd10 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65  K above for an e
2fd20 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20  xplanation). .  
2fd30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2fd40 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   ** In order to 
2fd50 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  get pager_unlock
2fd60 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73  () to do this, s
2fd70 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  et Pager.eState 
2fd80 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41  to.        ** PA
2fd90 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54  GER_ERROR now. T
2fda0 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
2fdb0 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61  lly counted as a
2fdc0 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20   transition.    
2fdd0 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20      ** to ERROR 
2fde0 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61  state in the sta
2fdf0 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68  te diagram at th
2fe00 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69  e top of this fi
2fe10 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  le,.        ** s
2fe20 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
2fe30 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20  t the same call 
2fe40 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
2fe50 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20  ) will very.    
2fe60 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74      ** shortly t
2fe70 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61  ransition the pa
2fe80 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ger object to th
2fe90 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61  e OPEN state. Ca
2fea0 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  lling.        **
2feb0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2fec0 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c  ate() would fail
2fed0 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75   now, as it shou
2fee0 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ld not be possib
2fef0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  le.        ** to
2ff00 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61   be in ERROR sta
2ff10 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  te when there ar
2ff20 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69  e zero outstandi
2ff30 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20  ng page .       
2ff40 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a   ** references..
2ff50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ff60 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
2ff70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
2ff80 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2ff90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2ffa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ffb0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2ffc0 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EN );.      asse
2ffd0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
2ffe0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
2fff0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
30000 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
30010 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
30020 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  >eLock>SHARED_LO
30030 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  CK).      );.   
30040 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
30050 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a 20  ger->tempFile . 
30060 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e      && (pPager->
30070 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74  pBackup || sqlit
30080 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
30090 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
300a0 65 29 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  e)>0) .    ){.  
300b0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
300c0 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
300d0 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
300e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
300f0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  le.      ** and 
30100 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
30110 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  y pages in the c
30120 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65  ache (from a pre
30130 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72  vious.      ** r
30140 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
30150 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
30160 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
30170 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
30180 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
30190 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
301a0 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
301b0 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
301c0 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
301d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
301e0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
301f0 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
30200 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
30210 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
30220 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
30230 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
30240 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
30250 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
30260 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20   are.      ** a 
30270 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
30280 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
30290 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
302a0 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
302b0 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
302c0 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
302d0 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
302e0 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
302f0 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
30300 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a   use..      ** .
30310 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
30320 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
30330 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
30340 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
30350 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a  not be .      **
30360 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
30370 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
30380 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
30390 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
303a0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
303b0 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
303c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e      */.      Pgn
303d0 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  o nPage = 0;.   
303e0 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
303f0 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
30400 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
30410 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
30420 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
30430 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
30440 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
30450 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69  failed;..      i
30460 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
30470 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
30480 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
30490 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
304a0 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
304b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
304c0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
304d0 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
304e0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
304f0 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
30500 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30520 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
30530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30540 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
30550 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
30560 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
30570 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
30580 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
30590 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
305a0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
305b0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
305c0 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
305d0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
305e0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
305f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
30600 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
30610 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  AL file in the f
30620 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e  ile-system, open
30630 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
30640 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64  n WAL.    ** mod
30650 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
30660 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
30670 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e  tion call is a n
30680 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
30690 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57   rc = pagerOpenW
306a0 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67  alIfPresent(pPag
306b0 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  er);.#ifndef SQL
306c0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
306d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
306e0 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d  >pWal==0 || rc==
306f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e  SQLITE_OK );.#en
30700 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
30710 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
30720 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
30730 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30740 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
30750 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
30760 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
30770 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
30780 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30790 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49  OPEN && rc==SQLI
307a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
307b0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
307c0 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
307d0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
307e0 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
307f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30800 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
30810 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
30820 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
30830 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30840 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
30850 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73  R_OPEN );.  }els
30860 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e{.    pPager->e
30870 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
30880 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ADER;.  }.  retu
30890 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
308a0 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
308b0 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
308c0 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63  ed zero, rollbac
308d0 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  k any active.** 
308e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
308f0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
30900 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
30910 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
30920 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74  EXCLUSIVE when t
30930 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
30940 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c  to in.** the rol
30950 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
30960 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74  he unlock is not
30970 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74   performed and t
30980 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69  here is.** nothi
30990 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  ng to rollback, 
309a0 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
309b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
309c0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
309d0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
309e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
309f0 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63    if( (sqlite3Pc
30a00 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
30a10 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
30a20 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e  ) ){.    pagerUn
30a30 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
30a40 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
30a50 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
30a60 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
30a70 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
30a80 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
30a90 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
30aa0 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
30ab0 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
30ac0 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
30ad0 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
30ae0 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
30af0 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
30b00 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
30b10 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
30b20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
30b30 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c  ested page is al
30b40 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
30b50 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  he, it is return
30b60 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
30b70 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  e, a new page ob
30b80 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
30b90 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
30ba0 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61  with data.** rea
30bb0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
30bc0 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d  ase file. In som
30bd0 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61  e cases, the pca
30be0 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a  che module may.*
30bf0 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20  * choose not to 
30c00 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
30c10 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d  age object and m
30c20 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  ay reuse an exis
30c30 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77  ting.** object w
30c40 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  ith no outstandi
30c50 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ng references..*
30c60 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64  *.** The extra d
30c70 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
30c80 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
30c90 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
30ca0 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69  zeros the .** fi
30cb0 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
30cc0 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
30cd0 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61  emory. If the pa
30ce0 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20  ge requested is 
30cf0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
30d00 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68  he cache when th
30d10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
30d20 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  alled, then the 
30d30 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73  extra.** data is
30d40 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20   left as it was 
30d50 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62  when the page ob
30d60 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73  ject was last us
30d70 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
30d80 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
30d90 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
30da0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
30db0 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e  ge or if a .** n
30dc0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
30dd0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e   passed as the n
30de0 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74  oContent paramet
30df0 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72  er and the .** r
30e00 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
30e10 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f   not already sto
30e20 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
30e30 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63  , then no .** ac
30e40 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f  tual disk read o
30e50 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ccurs. In this c
30e60 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  ase the memory i
30e70 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mage of the .** 
30e80 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
30e90 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73  zed to all zeros
30ea0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  . .**.** If noCo
30eb0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
30ec0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
30ed0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
30ee0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
30ef0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  * of the page. T
30f00 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
30f10 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61  o seperate scena
30f20 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
30f30 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
30f40 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
30f50 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
30f60 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
30f70 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
30f80 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
30f90 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
30fa0 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
30fb0 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
30fc0 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
30fd0 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
30fe0 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
30ff0 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
31000 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
31010 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
31020 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
31030 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
31040 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
31050 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
31060 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
31070 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
31080 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
31090 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
310a0 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
310b0 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
310c0 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
310d0 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
310e0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
310f0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
31100 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
31110 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
31120 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
31130 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
31140 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
31150 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
31160 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
31170 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
31180 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
31190 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
311a0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
311b0 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
311c0 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
311d0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
311e0 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
311f0 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
31200 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
31210 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
31220 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
31230 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
31240 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
31250 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
31260 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
31270 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
31280 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
31290 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
312a0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
312b0 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
312c0 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
312d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
312e0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
312f0 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
31300 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
31310 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
31320 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
31330 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
31340 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
31350 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
31360 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
31370 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
31380 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
31390 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
313a0 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
313b0 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
313c0 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
313d0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
313e0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
313f0 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
31400 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
31410 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
31420 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
31430 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
31440 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
31450 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
31460 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
31470 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
31480 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
31490 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
314a0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
314b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
314c0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
314d0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
314e0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
314f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
31500 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
31510 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
31520 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
31530 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
31540 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
31550 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
31560 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
31570 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
31580 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
31590 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
315a0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
315b0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
315c0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
315d0 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
315e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
315f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
31600 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
31610 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
31620 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20  r state, return 
31630 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61  an error immedia
31640 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  tely. .  ** Othe
31650 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74  rwise, request t
31660 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
31670 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a   PCache layer. *
31680 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
31690 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
316a0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
316b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
316c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
316d0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
316e0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
316f0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70  ache, pgno, 1, p
31700 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  pPage);.  }..  i
31710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31720 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
31730 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  r the call to sq
31740 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
31750 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  () returned an e
31760 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20  rror or the.    
31770 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72  ** pager was alr
31780 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
31790 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
317a0 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
317b0 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65  alled..    ** Se
317c0 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a  t pPg to 0 and j
317d0 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70  ump to the excep
317e0 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a  tion handler.  *
317f0 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  /.    pPg = 0;. 
31800 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
31810 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20  quire_err;.  }. 
31820 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
31830 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
31840 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
31850 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70  Page)->pPager==p
31860 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67  Pager || (*ppPag
31870 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b  e)->pPager==0 );
31880 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ..  if( (*ppPage
31890 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f  )->pPager && !no
318a0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f  Content ){.    /
318b0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
318c0 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
318d0 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
318e0 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
318f0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
31900 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
31910 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
31920 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
31930 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
31940 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
31950 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
31960 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
31970 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 72 65  ->nHit++;.    re
31980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
319a0 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
319b0 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
319c0 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
319d0 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
319e0 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
319f0 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70  ized.  */..    p
31a00 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  Pg = *ppPage;.  
31a10 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
31a20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  pPager;..    /* 
31a30 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
31a40 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
31a50 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
31a60 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
31a70 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  .    ** number g
31a80 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
31a90 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20  , or the unused 
31aa0 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73  locking-page, is
31ab0 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20   requested. */. 
31ac0 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45     if( pgno>PAGE
31ad0 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
31ae0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
31af0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
31b00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31b10 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
31b20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
31b30 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
31b40 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ..    if( MEMDB 
31b50 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
31b60 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
31b70 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ent || !isOpen(p
31b80 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
31b90 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
31ba0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
31bb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31bc0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
31bd0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
31be0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
31bf0 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
31c00 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
31c10 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
31c20 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
31c30 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
31c40 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
31c50 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
31c60 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
31c70 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
31c80 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
31c90 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
31ca0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
31cb0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
31cc0 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
31cd0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
31ce0 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
31cf0 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
31d00 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
31d10 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
31d20 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
31d30 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
31d40 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
31d50 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
31d60 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
31d70 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
31d80 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
31d90 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
31da0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
31db0 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
31dc0 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
31dd0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
31de0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
31df0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
31e00 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
31e10 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
31e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31e30 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
31e40 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
31e50 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
31e60 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
31e70 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
31e80 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
31e90 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
31ea0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
31eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
31ec0 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
31ed0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
31ee0 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
31ef0 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
31f00 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
31f10 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
31f20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
31f30 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
31f40 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
31f50 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 20  ->nMiss++;.     
31f60 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
31f70 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
31f80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31f90 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
31fa0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
31fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
31fc0 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
31fd0 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d  gehash(pPg);.  }
31fe0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
31ff0 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71  E_OK;..pager_acq
32000 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65  uire_err:.  asse
32010 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
32020 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  K );.  if( pPg )
32030 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
32040 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
32050 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
32060 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
32070 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ..  *ppPage = 0;
32080 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32090 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
320a0 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
320b0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
320c0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
320d0 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
320e0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
320f0 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
32100 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
32110 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
32120 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
32130 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65  cache. .**.** Se
32140 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
32150 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
32160 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
32170 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
32180 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
32190 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
321a0 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
321b0 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
321c0 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
321d0 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
321e0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
321f0 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
32200 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
32210 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
32220 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
32230 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
32240 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
32250 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
32260 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
32270 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
32280 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
32290 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
322a0 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73   *pPg = 0;.  ass
322b0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
322c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
322d0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
322e0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
322f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
32300 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
32310 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
32320 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
32330 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
32340 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46    sqlite3PcacheF
32350 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
32360 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
32370 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pPg);.  return p
32380 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
32390 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65  ease a page refe
323a0 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rence..**.** If 
323b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
323c0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
323d0 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
323e0 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
323f0 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
32400 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
32410 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
32420 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
32430 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
32440 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
32450 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
32460 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
32470 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
32480 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
32490 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
324a0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
324b0 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
324c0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
324d0 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
324e0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
324f0 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c  g);.    pagerUnl
32500 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
32510 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
32520 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
32530 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
32540 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
32550 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
32560 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
32570 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
32580 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
32590 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
325a0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
325b0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
325c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
325d0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
325e0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
325f0 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
32600 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
32610 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
32620 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
32630 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
32640 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
32650 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
32660 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
32670 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32680 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
32690 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
326a0 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
326b0 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
326c0 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
326d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
326e0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
326f0 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
32700 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
32710 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
32720 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
32730 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
32740 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
32750 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
32760 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
32770 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
32780 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
32790 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
327a0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
327b0 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
327c0 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
327d0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
327e0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
327f0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
32800 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
32810 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
32820 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
32830 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
32840 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
32850 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
32860 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
32870 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
32880 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
32890 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
328a0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
328b0 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
328c0 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
328d0 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
328e0 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
328f0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
32900 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
32910 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
32920 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
32930 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
32940 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
32950 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
32960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32970 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
32980 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
32990 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
329a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
329b0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
329c0 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
329d0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
329e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
329f0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
32a00 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
32a10 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
32a20 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
32a30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32a40 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
32a50 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
32a60 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
32a70 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
32a80 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
32a90 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
32aa0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
32ab0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
32ac0 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
32ad0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
32ae0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
32af0 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
32b00 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
32b10 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
32b20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
32b30 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
32b40 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
32b50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
32b60 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
32b70 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
32b80 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
32b90 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
32ba0 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
32bb0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
32bc0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
32bd0 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
32be0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32bf0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a  NOMEM;.    }.  .
32c00 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
32c10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
32c20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
32c30 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69  y open. */.    i
32c40 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
32c50 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
32c60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
32c70 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
32c80 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
32c90 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  RY ){.        sq
32ca0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
32cb0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32cc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
32cd0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
32ce0 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
32cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
32d00 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
32d10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
32d20 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
32d30 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f  E_DATA_PROTECTIO
32d40 4e 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61  N.          (pPa
32d50 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51  ger->vfsFlags&SQ
32d60 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52  LITE_OPEN_FILEPR
32d70 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a  OTECTION_MASK)|.
32d80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
32d90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
32da0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
32db0 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
32dc0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
32dd0 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
32de0 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
32df0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
32e00 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
32e10 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20  P_JOURNAL):.    
32e20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
32e30 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
32e40 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  L).          );.
32e50 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
32e60 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
32e70 49 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ITE.        rc =
32e80 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
32e90 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20  pen(.           
32ea0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
32eb0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
32ec0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
32ed0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
32ee0 65 72 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  er).        );. 
32ef0 20 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72   #else.        r
32f00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
32f10 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
32f20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
32f30 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
32f40 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20  ;.  #endif.     
32f50 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
32f60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
32f70 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
32f80 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20  >jfd) );.    }. 
32f90 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   .  .    /* Writ
32fa0 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
32fb0 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
32fc0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
32fd0 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  nd open .    ** 
32fe0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
32ff0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
33000 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
33010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33020 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
33030 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck if all of the
33040 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65  se are really re
33050 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
33060 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
33070 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
33080 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
33090 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
330a0 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
330b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
330c0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
330d0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
330e0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
330f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
33100 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33110 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
33120 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
33130 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
33140 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
33150 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65  ournal = 0;.  }e
33160 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
33170 20 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 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
33190 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67  CKED );.    pPag
331a0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
331b0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
331c0 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OD;.  }..  retur
331d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
331e0 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
331f0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
33200 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
33210 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
33220 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
33230 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
33240 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
33250 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
33260 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
33270 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
33280 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
33290 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
332a0 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
332b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
332c0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
332d0 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
332e0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
332f0 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
33300 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
33310 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
33320 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
33330 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
33340 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
33350 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
33360 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
33370 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
33380 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
33390 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
333a0 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
333b0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
333c0 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
333d0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
333e0 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
333f0 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
33400 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
33410 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
33420 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
33430 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
33440 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
33450 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
33460 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
33470 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
33480 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
33490 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
334a0 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
334b0 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
334c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
334d0 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
334e0 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
334f0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
33500 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
33510 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
33520 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
33530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33540 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
33550 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
33560 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
33570 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
33580 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
33590 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
335a0 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70  rCode ) return p
335b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
335c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
335d0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
335e0 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
335f0 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45  ->eState<PAGER_E
33600 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72  RROR );.  pPager
33610 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
33620 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
33630 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  y;..  if( ALWAYS
33640 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
33650 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29  =PAGER_READER) )
33660 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
33670 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
33680 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
33690 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
336a0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  er) ){.      /* 
336b0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
336c0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
336d0 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  e locking_mode=e
336e0 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e  xclusive, and an
336f0 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
33700 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
33710 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
33720 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62  already held, ob
33730 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20  tain it now..   
33740 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
33750 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
33760 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
33770 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
33780 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d  (pPager->pWal, -
33790 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
337a0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
337b0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
337c0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
337d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
337e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
337f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
33800 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
33810 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
33820 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
33830 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
33840 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65       /* Grab the
33850 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
33860 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20  he log file. If 
33870 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72  successful, upgr
33880 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ade to.      ** 
33890 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
338a0 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
338b0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
338c0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
338d0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ler..      ** Th
338e0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
338f0 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66  s not invoked if
33900 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
33910 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ion already.    
33920 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77    ** holds the w
33930 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f  rite-lock. If po
33940 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65  ssible, the uppe
33950 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c  r layer will cal
33960 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  l it..      */. 
33970 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33980 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72  3WalBeginWriteTr
33990 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
339a0 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  ->pWal);.    }el
339b0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  se{.      /* Obt
339c0 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
339d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
339e0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
339f0 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65   exFlag paramete
33a00 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72  r.      ** is tr
33a10 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61  ue, then immedia
33a20 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69  tely upgrade thi
33a30 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  s to an EXCLUSIV
33a40 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
33a50 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65    ** busy-handle
33a60 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62  r callback can b
33a70 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72  e used when upgr
33a80 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43  ading to the EXC
33a90 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20  LUSIVE.      ** 
33aa0 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
33ab0 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
33ac0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
33ad0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
33ae0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
33af0 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
33b00 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
33b10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33b20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  && exFlag ){.   
33b30 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
33b40 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
33b50 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
33b60 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
33b70 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
33b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33b90 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f      /* Change to
33ba0 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
33bb0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
33bc0 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
33bd0 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61   sets Pager.eSta
33be0 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54  te to PAGER_WRIT
33bf0 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43  ER_LOCKED or CAC
33c00 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77  HEMOD.      ** w
33c10 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70  hen it has an op
33c20 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
33c30 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d  but never to DBM
33c40 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a  OD or FINISHED..
33c50 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
33c60 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73   because in thos
33c70 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64  e states the cod
33c80 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
33c90 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
33ca0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
33cb0 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72  may copy data fr
33cc0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
33cd0 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  al into the data
33ce0 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66  base .      ** f
33cf0 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69  ile as well as i
33d00 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63  nto the page cac
33d10 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20  he. Which would 
33d20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20  be incorrect in 
33d30 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
33d40 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  de..      */.   
33d50 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
33d60 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
33d70 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70  _LOCKED;.      p
33d80 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
33d90 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
33da0 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
33db0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
33dc0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
33dd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f       pPager->dbO
33de0 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72  rigSize = pPager
33df0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
33e00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
33e10 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ff = 0;.    }.. 
33e20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
33e30 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
33e40 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33e50 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
33e60 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
33e70 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
33e80 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
33e90 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
33ea0 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
33eb0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
33ec0 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20  Pager) );.  }.. 
33ed0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52   PAGERTRACE(("TR
33ee0 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
33ef0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
33f00 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
33f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
33f20 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67   single data pag
33f30 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
33f40 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
33f50 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
33f60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72   main journal or
33f70 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20   sub-journal as 
33f80 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65  required. If the
33f90 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
33fa0 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20   into.** one of 
33fb0 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  the journals, th
33fc0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
33fd0 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68  bit is set in th
33fe0 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  e .** Pager.pInJ
33ff0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e  ournal bitvec an
34000 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
34010 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
34020 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20  t bitvecs.** of 
34030 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  any open savepoi
34040 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61  nts as appropria
34050 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
34060 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
34070 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
34080 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
34090 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a  pData;.  Pager *
340a0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
340b0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
340c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
340d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
340e0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c  s not called unl
340f0 65 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ess a write-tran
34100 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
34110 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73  ady .  ** been s
34120 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72  tarted. The jour
34130 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20  nal file may or 
34140 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20  may not be open 
34150 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  at this point.. 
34160 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20   ** It is never 
34170 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52  called in the ER
34180 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a  ROR state..  */.
34190 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
341a0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
341b0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
341c0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
341d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
341e0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
341f0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
34200 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
34210 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
34220 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
34230 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
34240 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ger) );..  /* If
34250 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65   an error has be
34260 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65  en previously de
34270 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74  tected, report t
34280 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20  he same error.  
34290 2a 2a 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73  ** again. This s
342a0 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e  hould not happen
342b0 2c 20 62 75 74 20 74 68 65 20 63 68 65 63 6b 20  , but the check 
342c0 70 72 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e  provides robustn
342d0 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ess. */.  if( NE
342e0 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
342f0 6f 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70  ode) )  return p
34300 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
34310 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76  .  /* Higher-lev
34320 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65  el routines neve
34330 72 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  r call this func
34340 74 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65  tion if database
34350 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69   is not.  ** wri
34360 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63  table.  But chec
34370 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66  k anyway, just f
34380 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a  or robustness. *
34390 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
343a0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ager->readOnly) 
343b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
343c0 50 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  PERM;..  CHECK_P
343d0 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
343e0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
343f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65   needs to be ope
34400 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65  ned. Higher leve
34410 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  l routines have 
34420 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74  already.  ** obt
34430 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73  ained the necess
34440 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67  ary locks to beg
34450 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  in the write-tra
34460 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68  nsaction, but th
34470 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  e.  ** rollback 
34480 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
34490 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f  t yet be open. O
344a0 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68  pen it now if th
344b0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
344c0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
344d0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61  s done before ca
344e0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
344f0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f  cheMakeDirty() o
34500 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a  n the page. .  *
34510 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
34520 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74  it were done aft
34530 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  er calling sqlit
34540 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
34550 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  y(), then.  ** a
34560 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63  n error might oc
34570 63 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65  cur and the page
34580 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69  r would end up i
34590 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
345a0 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20  state.  ** with 
345b0 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20  pages marked as 
345c0 64 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63  dirty in the cac
345d0 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  he..  */.  if( p
345e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
345f0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
34600 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ED ){.    rc = p
34610 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
34620 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
34630 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34640 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
34650 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
34660 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
34670 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
34680 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
34690 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
346a0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
346b0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
346c0 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
346d0 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
346e0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
346f0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
34700 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
34710 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
34720 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ay..  */.  sqlit
34730 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
34740 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61  y(pPg);.  if( pa
34750 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
34760 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65   && !subjRequire
34770 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
34780 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
34790 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
347a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  ;.  }else{.  .  
347b0 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
347c0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
347d0 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
347e0 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
347f0 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
34800 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
34810 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
34820 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
34830 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
34840 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
34850 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
34860 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
34870 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
34880 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
34890 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
348a0 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
348b0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
348c0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
348d0 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
348e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  ;.      if( pPg-
348f0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
34900 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f  bOrigSize && isO
34910 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
34920 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
34930 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
34940 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20  har *pData2;.   
34950 20 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20       i64 iOff = 
34960 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
34970 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ff;..        /* 
34980 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
34990 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
349a0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
349b0 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
349c0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
349d0 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
349e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
349f0 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
34a00 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
34a10 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
34a20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
34a30 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
34a40 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
34a50 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
34a60 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
34a70 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lHdr<=pPager->jo
34a80 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
34a90 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
34aa0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
34ab0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
34ac0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
34ad0 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  ta2);.        ck
34ae0 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
34af0 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
34b00 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20  Data2);..       
34b10 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49   /* Even if an I
34b20 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72  O or diskfull er
34b30 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
34b40 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65   journalling the
34b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
34b60 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
34b70 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
34b80 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
34b90 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20  the page..      
34ba0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
34bb0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
34bc0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
34bd0 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
34be0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61  n.        ** pla
34bf0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
34c00 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74   will think that
34c10 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
34c20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20  to be restored. 
34c30 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
34c40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
34c50 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72  And if an IO err
34c60 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
34c70 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20  doing so,.      
34c80 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70    ** then corrup
34c90 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e  tion may follow.
34ca0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
34cb0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
34cc0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
34cd0 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  C;..        rc =
34ce0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
34cf0 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20  ger->jfd, iOff, 
34d00 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
34d10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34d20 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
34d30 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
34d40 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
34d50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
34d60 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
34d70 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  Size, iOff+4);. 
34d80 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
34d90 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
34da0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63  n rc;.        rc
34db0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
34dc0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66  Pager->jfd, iOff
34dd0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
34de0 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  e+4, cksum);.   
34df0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34e00 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
34e10 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54  rc;..        IOT
34e20 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
34e30 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
34e40 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
34e50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
34e60 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
34e70 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
34e80 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
34e90 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
34ea0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
34eb0 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
34ec0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
34ed0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
34ee0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
34ef0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
34f00 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
34f10 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
34f20 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
34f30 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
34f40 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
34f50 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70  C)?1:0), pager_p
34f60 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
34f70 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
34f80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38  >journalOff += 8
34f90 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
34fa0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ize;.        pPa
34fb0 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
34fc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
34fd0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
34fe0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
34ff0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
35000 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
35010 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
35020 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
35030 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
35040 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
35050 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
35060 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
35070 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
35080 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64         rc |= add
35090 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
350a0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
350b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
350c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
350d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
350e0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
350f0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
35100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
35130 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35140 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  !=PAGER_WRITER_D
35150 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20  BMOD ){.        
35160 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
35170 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
35180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35190 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
351a0 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
351b0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
351c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
351d0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
351e0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
351f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
35200 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
35210 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
35220 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35230 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
35240 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
35250 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
35260 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
35270 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
35280 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
35290 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
352a0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
352b0 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
352c0 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
352d0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
352e0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
352f0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
35300 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
35310 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
35320 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
35330 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
35340 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35350 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
35360 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
35370 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
35380 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
35390 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
353a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
353b0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
353c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
353d0 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
353e0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
353f0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
35400 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
35410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
35420 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
35430 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
35440 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
35450 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
35460 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61  e .** making cha
35470 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20  nges to a page. 
35480 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
35490 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
354a0 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68   value .** of th
354b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
354c0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
354d0 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  o change any pag
354e0 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a  e data unless .*
354f0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
35500 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
35510 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
35520 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
35530 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
35540 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
35550 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
35560 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
35570 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
35580 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
35590 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
355a0 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
355b0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
355c0 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
355d0 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
355e0 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
355f0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
35600 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35610 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
35620 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
35630 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
35640 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
35650 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
35660 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61  returned.** as a
35670 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65  ppropriate. Othe
35680 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
35690 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
356a0 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
356b0 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
356c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
356d0 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
356e0 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
356f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
35700 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
35710 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
35720 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
35730 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
35740 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73  ageSize);..  ass
35750 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35760 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
35770 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73  R_LOCKED );.  as
35780 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35790 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
357a0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
357b0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
357c0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
357d0 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74  if( nPagePerSect
357e0 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
357f0 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
35800 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
35810 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
35820 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
35830 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
35840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35850 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
35860 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
35870 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
35880 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
35890 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
358a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
358b0 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
358c0 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
358d0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
358e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
35900 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  */.    int needS
35910 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ync = 0;        
35920 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
35930 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e  page has PGHDR_N
35940 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20  EED_SYNC */..   
35950 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
35960 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20  tSyncSpill flag 
35970 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65  to 1. This is be
35980 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20  cause we cannot 
35990 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a  allow.    ** a j
359a0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
359b0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77   be written betw
359c0 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f  een the pages jo
359d0 75 72 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a  urnaled by.    *
359e0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  * this function.
359f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
35a00 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
35a10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35a20 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
35a30 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
35a40 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
35a50 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  l++;..    /* Thi
35a60 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20  s trick assumes 
35a70 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61  that both the pa
35a80 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
35a90 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20  or-size are.    
35aa0 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f  ** an integer po
35ab0 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74  wer of 2. It set
35ac0 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74  s variable pg1 t
35ad0 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  o the identifier
35ae0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
35af0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
35b00 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
35b10 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a  ocated on..    *
35b20 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50  /.    pg1 = ((pP
35b30 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e  g->pgno-1) & ~(n
35b40 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
35b50 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67  ) + 1;..    nPag
35b60 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d  eCount = pPager-
35b70 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28  >dbSize;.    if(
35b80 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
35b90 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
35ba0 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
35bb0 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
35bc0 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
35bd0 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
35be0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
35bf0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
35c00 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
35c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35c20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
35c30 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
35c40 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
35c50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
35c60 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
35c70 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
35c80 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
35c90 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
35ca0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
35cb0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
35cc0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
35cd0 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
35ce0 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
35cf0 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
35d00 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
35d10 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
35d20 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
35d30 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
35d40 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
35d50 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
35d60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35d70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
35d80 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
35d90 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
35da0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35dc0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
35dd0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
35de0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
35df0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
35e00 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
35e10 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
35e20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
35e30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
35e40 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35e50 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
35e60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
35e70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
35e80 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
35e90 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
35ea0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
35eb0 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
35ec0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
35ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
35ee0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
35ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
35f00 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35f10 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
35f20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
35f30 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
35f40 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74  SYNC flag is set
35f50 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
35f60 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
35f70 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
35f80 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
35f90 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
35fa0 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
35fb0 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
35fc0 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
35fd0 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
35fe0 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
35ff0 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
36000 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
36010 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
36020 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
36030 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
36040 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
36050 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
36060 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
36070 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
36080 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
36090 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
360a0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
360b0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
360c0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
360d0 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b  0; ii<nPage; ii+
360e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64  +){.        PgHd
360f0 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72  r *pPage = pager
36100 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
36110 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20  pg1+ii);.       
36120 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
36130 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66          pPage->f
36140 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
36150 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
36160 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36170 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
36180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
36190 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
361a0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
361b0 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20  yncSpill==1 );. 
361c0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
361d0 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d  SyncSpill--;.  }
361e0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
361f0 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
36200 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
36210 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
36220 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
36230 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
36240 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
36250 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
36260 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
36270 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
36280 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
36290 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
362a0 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
362b0 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
362c0 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
362d0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
362e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
362f0 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
36300 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
36310 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  n pPg->flags&PGH
36320 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64  DR_DIRTY;.}.#end
36330 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
36340 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
36350 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
36360 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
36370 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
36380 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
36390 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
363a0 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
363b0 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
363c0 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
363d0 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
363e0 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70  dirty.  This hap
363f0 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
36400 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, when.** the p
36410 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64  age has been add
36420 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20  ed as a leaf of 
36430 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
36440 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65   so its.** conte
36450 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74  nt no longer mat
36460 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ters..**.** The 
36470 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
36480 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
36490 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
364a0 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
364b0 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
364c0 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
364d0 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
364e0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
364f0 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
36500 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
36510 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
36520 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
36530 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
36540 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72  zation can quadr
36550 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
36560 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45  f large .** DELE
36570 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  TE operations..*
36580 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
36590 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48  gerDontWrite(PgH
365a0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
365b0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
365c0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28  >pPager;.  if( (
365d0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
365e0 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65  _DIRTY) && pPage
365f0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
36600 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
36610 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE(("DONT_WRITE 
36620 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
36630 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
36640 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
36650 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
36660 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
36670 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
36680 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ).    pPg->flags
36690 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57   |= PGHDR_DONT_W
366a0 52 49 54 45 3b 0a 20 20 20 20 70 61 67 65 72 5f  RITE;.    pager_
366b0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
366c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
366d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
366e0 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
366f0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ent the value of
36700 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36710 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f  le .** change-co
36720 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73  unter, stored as
36730 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 4-byte big-en
36740 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61  dian integer sta
36750 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74  rting at .** byt
36760 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74  e offset 24 of t
36770 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 20 20  he pager file.  
36780 54 68 65 20 73 65 63 6f 6e 64 61 72 79 20 63 68  The secondary ch
36790 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 74 0a  ange counter at.
367a0 2a 2a 20 39 32 20 69 73 20 61 6c 73 6f 20 75 70  ** 92 is also up
367b0 64 61 74 65 64 2c 20 61 73 20 69 73 20 74 68 65  dated, as is the
367c0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
367d0 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
367e0 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74   96..**.** But t
367f0 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
36800 20 69 66 20 74 68 65 20 70 50 61 67 65 72 2d 3e   if the pPager->
36810 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
36820 66 6c 61 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a  flag is false..*
36830 2a 20 54 6f 20 61 76 6f 69 64 20 65 78 63 65 73  * To avoid exces
36840 73 20 63 68 75 72 6e 69 6e 67 20 6f 66 20 70 61  s churning of pa
36850 67 65 20 31 2c 20 74 68 65 20 75 70 64 61 74 65  ge 1, the update
36860 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e   only happens on
36870 63 65 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  ce..** See also 
36880 74 68 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  the pager_write_
36890 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
368a0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65  routine that doe
368b0 73 20 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69  s an .** uncondi
368c0 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f 66  tional update of
368d0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
368e0 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ters..**.** If t
368f0 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
36900 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68  flag is zero, th
36910 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  en this is done 
36920 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  by calling .** s
36930 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36940 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  () on page 1, th
36950 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  en modifying the
36960 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
36970 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49  .** page data. I
36980 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
36990 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64  file will be upd
369a0 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  ated when the cu
369b0 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
369c0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
369d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44  d..**.** The isD
369e0 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d  irectMode flag m
369f0 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a  ay only be non-z
36a00 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61  ero if the libra
36a10 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a  ry was compiled.
36a20 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ** with the SQLI
36a30 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
36a40 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66  _WRITE macro def
36a50 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ined. In this ca
36a60 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65  se,.** if isDire
36a70 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ct is non-zero, 
36a80 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
36a90 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  e file is update
36aa0 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79  d directly.** by
36ab0 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61   writing an upda
36ac0 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ted version of p
36ad0 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61  age 1 using a ca
36ae0 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71  ll to the .** sq
36af0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66  lite3OsWrite() f
36b00 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
36b10 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
36b20 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
36b30 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
36b40 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29  nt isDirectMode)
36b50 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
36b60 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
36b70 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36b80 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36b90 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
36ba0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
36bb0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36bc0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
36bd0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
36be0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
36bf0 29 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65  );..  /* Declare
36c00 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
36c10 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
36c20 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20   'isDirect'. If 
36c30 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d  the.  ** atomic-
36c40 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
36c50 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e  on is enabled in
36c60 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65   this build, the
36c70 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20  n isDirect.  ** 
36c80 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
36c90 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
36ca0 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65  ed as the isDire
36cb0 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  ctMode parameter
36cc0 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  .  ** to this fu
36cd0 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
36ce0 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
36cf0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  set to zero..  *
36d00 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20  *.  ** The idea 
36d10 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61  is that if the a
36d20 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
36d30 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  mization is not.
36d40 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20    ** enabled at 
36d50 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
36d60 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f  e compiler can o
36d70 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66  mit the tests of
36d80 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27  .  ** 'isDirect'
36d90 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20   below, as well 
36da0 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63  as the block enc
36db0 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a  losed in the.  *
36dc0 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20  * "if( isDirect 
36dd0 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20  )" condition..  
36de0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
36df0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
36e00 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44  WRITE.# define D
36e10 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61  IRECT_MODE 0.  a
36e20 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d  ssert( isDirectM
36e30 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  ode==0 );.  UNUS
36e40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
36e50 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73  irectMode);.#els
36e60 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  e.# define DIREC
36e70 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d  T_MODE isDirectM
36e80 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  ode.#endif..  if
36e90 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
36ea0 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50  eCountDone && pP
36eb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
36ec0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
36ed0 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
36ee0 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
36ef0 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20   to page 1 */.. 
36f00 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
36f10 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
36f20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
36f30 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  d) );..    /* Op
36f40 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
36f50 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
36f60 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
36f70 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
36f80 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
36f90 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
36fa0 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d  pPgHdr==0 || rc=
36fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
36fc0 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e     /* If page on
36fd0 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75  e was fetched su
36fe0 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20  ccessfully, and 
36ff0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
37000 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72   not.    ** oper
37010 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d  ating in direct-
37020 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20  mode, make page 
37030 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65  1 writable.  Whe
37040 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a  n not in .    **
37050 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61   direct mode, pa
37060 67 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68  ge 1 is always h
37070 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64  eld in cache and
37080 20 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72   hence the Pager
37090 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  Get().    ** abo
370a0 76 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63  ve is always suc
370b0 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20  cessful - hence 
370c0 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63  the ALWAYS on rc
370d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20  ==SQLITE_OK..   
370e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52   */.    if( !DIR
370f0 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41  ECT_MODE && ALWA
37100 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  YS(rc==SQLITE_OK
37110 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
37120 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
37130 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d  e(pPgHdr);.    }
37140 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
37150 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37160 20 2f 2a 20 41 63 74 75 61 6c 6c 79 20 64 6f 20   /* Actually do 
37170 74 68 65 20 75 70 64 61 74 65 20 6f 66 20 74 68  the update of th
37180 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
37190 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f   */.      pager_
371a0 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
371b0 74 65 72 28 70 50 67 48 64 72 29 3b 0a 0a 20 20  ter(pPgHdr);..  
371c0 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
371d0 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
371e0 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
371f0 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
37200 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
37210 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f       if( DIRECT_
37220 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MODE ){.        
37230 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
37240 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37250 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
37260 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
37270 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
37280 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20   pPgHdr->pData, 
37290 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f  1, 6, rc=SQLITE_
372a0 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20  NOMEM, zBuf);.  
372b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
372c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
372d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
372e0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
372f0 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
37300 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
37310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37320 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37340 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
37350 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
37360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
37380 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
37390 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
373a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
373b0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
373c0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
373d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
373e0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
373f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
37400 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
37410 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37420 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73  to disk. This is
37430 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d   a no-op for in-
37440 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
37450 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74  .** or pages wit
37460 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  h the Pager.noSy
37470 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  nc flag set..**.
37480 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
37490 2c 20 6f 72 20 69 66 20 63 61 6c 6c 65 64 20 6f  , or if called o
374a0 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68  n a pager for wh
374b0 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ich it is a no-o
374c0 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  p, this.** funct
374d0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
374e0 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
374f0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
37500 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
37510 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37520 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
37530 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
37540 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37550 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
37560 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
37570 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
37580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
37590 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
375a0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
375b0 73 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  s);.  }else if( 
375c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
375d0 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
375e0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
375f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
37600 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
37610 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
37620 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 2c  TL_SYNC_OMITTED,
37630 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
37640 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
37650 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
37660 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
37670 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
37690 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
376a0 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65   be called while
376b0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
376c0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 69  tion is active i
376d0 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  n.** rollback. I
376e0 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
376f0 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
37700 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
37710 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72  no-op. .** Other
37720 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e  wise, if the con
37730 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  nection does not
37740 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 6e   already have an
37750 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
37760 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  on .** the datab
37770 61 73 65 20 66 69 6c 65 2c 20 61 6e 20 61 74 74  ase file, an att
37780 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
37790 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a  obtain one..**.*
377a0 2a 20 49 66 20 74 68 65 20 45 58 43 4c 55 53 49  * If the EXCLUSI
377b0 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  VE lock is alrea
377c0 64 79 20 68 65 6c 64 20 6f 72 20 74 68 65 20 61  dy held or the a
377d0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
377e0 20 69 74 20 69 73 0a 2a 2a 20 73 75 63 63 65 73   it is.** succes
377f0 73 66 75 6c 2c 20 6f 72 20 74 68 65 20 63 6f 6e  sful, or the con
37800 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41  nection is in WA
37810 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f 4f  L mode, SQLITE_O
37820 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
37830 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 65 69 74  * Otherwise, eit
37840 68 65 72 20 53 51 4c 49 54 45 5f 42 55 53 59 20  her SQLITE_BUSY 
37850 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  or an SQLITE_IOE
37860 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
37870 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
37880 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
37890 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
378a0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
378b0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
378c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
378d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
378e0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
378f0 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20 20 20 20  _CACHEMOD .     
37900 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37910 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37920 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20 20 20 20  R_DBMOD .       
37930 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37940 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37950 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a 20 20 61  LOCKED .  );.  a
37960 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37970 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37980 29 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70 61  ) );.  if( 0==pa
37990 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
379a0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  ) ){.    rc = pa
379b0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
379c0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
379d0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  VE_LOCK);.  }.  
379e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
379f0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
37a00 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
37a10 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
37a20 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
37a30 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
37a40 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
37a50 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
37a60 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
37a70 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
37a80 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
37a90 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
37aa0 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
37ab0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
37ac0 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
37ad0 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
37ae0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
37af0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
37b00 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
37b10 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s that:.**.**   
37b20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
37b30 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
37b40 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  er is updated,.*
37b50 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61  *   * the journa
37b60 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c  l is synced (unl
37b70 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ess the atomic-w
37b80 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
37b90 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20  n is used),.**  
37ba0 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67   * all dirty pag
37bb0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  es are written t
37bc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
37bd0 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65  ile, .**   * the
37be0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
37bf0 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20  s truncated (if 
37c00 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a  required), and.*
37c10 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
37c20 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
37c30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
37c40 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69  thing that remai
37c50 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
37c60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
37c70 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20  to finalize .** 
37c80 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
37c90 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69  e or zero the fi
37ca0 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65  rst part of) the
37cb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
37cc0 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  r .** delete the
37cd0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
37ce0 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
37cf0 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
37d00 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
37d10 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
37d20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
37d30 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
37d40 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
37d50 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
37d60 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
37d70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
37d80 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
37d90 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
37da0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
37db0 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
37dc0 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
37dd0 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
37de0 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
37df0 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
37e00 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
37e10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37e20 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
37e30 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
37e40 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
37e50 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
37e60 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
37e70 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
37e80 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
37e90 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
37ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37eb0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
37ec0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
37ed0 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20  r *zMaster,     
37ee0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
37ef0 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65   NULL, the maste
37f00 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
37f10 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20  /.  int noSync  
37f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f30 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
37f40 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e  mit the xSync on
37f50 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
37f60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
37f70 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
37f80 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
37f90 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
37fa0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37fb0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
37fc0 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
37fd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37fe0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
37ff0 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
38000 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
38010 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
38020 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
38030 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
38040 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 20 20  ER_ERROR.  );.  
38050 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
38060 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
38070 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  r) );..  /* If a
38080 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63   prior error occ
38090 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74 68  urred, report th
380a0 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e 20  at error again. 
380b0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
380c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
380d0 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
380e0 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47  >errCode;..  PAG
380f0 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42 41  ERTRACE(("DATABA
38100 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
38110 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a   zMaster=%s nSiz
38120 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  e=%d\n", .      
38130 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
38140 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  e, zMaster, pPag
38150 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20  er->dbSize));.. 
38160 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61 62 61   /* If no databa
38170 73 65 20 63 68 61 6e 67 65 73 20 68 61 76 65 20  se changes have 
38180 62 65 65 6e 20 6d 61 64 65 2c 20 72 65 74 75 72  been made, retur
38190 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66  n early. */.  if
381a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
381b0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  <PAGER_WRITER_CA
381c0 43 48 45 4d 4f 44 20 29 20 72 65 74 75 72 6e 20  CHEMOD ) return 
381d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
381e0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f  ( MEMDB ){.    /
381f0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
38200 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
38210 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
38220 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
38230 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66  or this.    ** f
38240 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
38250 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
38260 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20   it is mostly a 
38270 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c  no-op.  However,
38280 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b   any.    ** back
38290 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e  up in progress n
382a0 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 61  eeds to be resta
382b0 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rted..    */.   
382c0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
382d0 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
382e0 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  ackup);.  }else{
382f0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
38300 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
38310 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69        PgHdr *pLi
38320 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
38330 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
38340 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
38350 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
38360 4f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  One = 0;.      i
38370 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
38380 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 68         /* Must h
38390 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
383a0 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 57 41   page for the WA
383b0 4c 20 63 6f 6d 6d 69 74 20 66 6c 61 67 2e 0a 20  L commit flag.. 
383c0 20 20 20 20 20 20 20 2a 2a 20 54 69 63 6b 65 74         ** Ticket
383d0 20 5b 32 64 31 61 35 63 36 37 64 66 63 32 33 36   [2d1a5c67dfc236
383e0 33 65 34 34 66 32 39 64 39 62 62 64 35 37 66 5d  3e44f29d9bbd57f]
383f0 20 32 30 31 31 2d 30 35 2d 31 38 20 2a 2f 0a 20   2011-05-18 */. 
38400 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
38410 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
38420 65 72 2c 20 31 2c 20 26 70 50 61 67 65 4f 6e 65  er, 1, &pPageOne
38430 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
38440 20 3d 20 70 50 61 67 65 4f 6e 65 3b 0a 20 20 20   = pPageOne;.   
38450 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 44 69 72       pList->pDir
38460 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ty = 0;.      }.
38470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
38480 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
38490 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
384a0 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
384b0 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46    rc = pagerWalF
384c0 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 4c  rames(pPager, pL
384d0 69 73 74 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ist, pPager->dbS
384e0 69 7a 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ize, 1);.      }
384f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
38500 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 4f 6e  gerUnref(pPageOn
38510 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
38520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
38530 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63         sqlite3Pc
38540 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
38550 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
38560 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
38570 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  {.      /* The f
38580 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75  ollowing block u
38590 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
385a0 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74  e-counter. Exact
385b0 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20 20  ly how it.      
385c0 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65 70  ** does this dep
385d0 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
385e0 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
385f0 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
38600 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ation.      ** w
38610 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
38620 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20  mpile time, and 
38630 69 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  if this transact
38640 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20  ion meets the . 
38650 20 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20       ** runtime 
38660 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65 20  criteria to use 
38670 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a  the operation: .
38680 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
38690 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d  *    * The file-
386a0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
386b0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
386c0 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20   property for.  
386d0 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63      **      bloc
386e0 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d  ks of size page-
386f0 73 69 7a 65 2c 20 61 6e