/ Hex Artifact Content
Login

Artifact ddef1e661fbfe6b13d43273c7672485f6fb847cd:


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 2a 0a 2a 2a 20 20  b-codes..**.**  
6fa0: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
6fb0: 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  e is set to SQLI
6fc0: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6fd0: 6f 66 20 69 74 73 20 73 75 62 63 6f 64 65 73 2c  of its subcodes,
6fe0: 20 74 68 65 6e 0a 2a 2a 20 20 20 74 68 69 73 20   then.**   this 
6ff0: 76 61 6c 75 65 20 69 73 20 69 6d 6d 65 64 69 61  value is immedia
7000: 74 65 6c 79 20 72 65 74 75 72 6e 65 64 20 77 68  tely returned wh
7010: 65 6e 20 65 76 65 72 20 61 6e 79 20 73 71 6c 69  en ever any sqli
7020: 74 65 33 50 61 67 65 72 58 58 58 28 29 20 6d 65  te3PagerXXX() me
7030: 74 68 6f 64 0a 2a 2a 20 20 20 74 68 61 74 20 72  thod.**   that r
7040: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
7050: 63 6f 64 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  code is called. 
7060: 49 66 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  If it is set to 
7070: 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 0a 2a 2a 20  SQLITE_FULL,.** 
7080: 20 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74    then it is ret
7090: 75 72 6e 65 64 20 77 68 65 6e 65 76 65 72 20 61  urned whenever a
70a0: 6e 79 20 73 75 63 68 20 73 71 6c 69 74 65 33 50  ny such sqlite3P
70b0: 61 67 65 72 58 58 58 28 29 20 6d 65 74 68 6f 64  agerXXX() method
70c0: 20 65 78 63 65 70 74 0a 2a 2a 20 20 20 66 6f 72   except.**   for
70d0: 20 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20   PagerAcquire() 
70e0: 6f 72 20 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  or PagerLookup()
70f0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
7100: 2a 20 20 20 54 4f 44 4f 3a 20 52 65 76 69 65 77  *   TODO: Review
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c   the SQLITE_FULL
7120: 2f 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20  /PagerAcquire() 
7130: 65 78 63 65 70 74 69 6f 6e 2e 20 49 73 20 69 74  exception. Is it
7140: 20 61 20 67 6f 6f 64 20 69 64 65 61 3f 0a 2a 2a   a good idea?.**
7150: 20 20 20 20 20 20 20 20 20 49 66 20 73 6f 2c 20           If so, 
7160: 61 72 65 20 74 68 65 72 65 20 62 75 67 73 20 77  are there bugs w
7170: 68 65 72 65 62 79 20 73 68 61 72 65 64 2d 63 61  hereby shared-ca
7180: 63 68 65 20 63 6c 69 65 6e 74 73 20 63 61 6e 20  che clients can 
7190: 73 65 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  see .**         
71a0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 64 61 74 61  uncommitted data
71b0: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
71c0: 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  is in the ERROR 
71d0: 73 74 61 74 65 3f 0a 2a 2a 0a 2a 2f 0a 73 74 72  state?.**.*/.str
71e0: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
71f0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
7200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
7210: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
7220: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
7230: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
7240: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
7250: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
7260: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
7270: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
7280: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
7290: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
72a0: 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  the PAGER_JOURNA
72b0: 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a  LMODE_* values *
72c0: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
72d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
72e0: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
72f0: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
7300: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
7310: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
7320: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7330: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
7340: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
7350: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7370: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
7380: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
7390: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
73a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
73b0: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
73c0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
73d0: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
73e0: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
73f0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7400: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
7410: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7420: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65  _FULL */.  u8 te
7430: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7440: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7450: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7460: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7470: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7490: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
74a0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
74b0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
74c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
74d0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
74e0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
74f0: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7540: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7550: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7560: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7570: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7580: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
7590: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
75a0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
75b0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
75c0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
75d0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
75e0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
75f0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7600: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7610: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7620: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7630: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7640: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7650: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7660: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7670: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7680: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7690: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
76a0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
76b0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
76c0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
76d0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
76e0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
76f0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7700: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7710: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7720: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7740: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7750: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7760: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7770: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7790: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
77a0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
77b0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
77c0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
77d0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
77e0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
77f0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7800: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7810: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7820: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7830: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7840: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7850: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7860: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7870: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7880: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7890: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
78a0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
78b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
78c0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
78d0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
78e0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
78f0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7900: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7910: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7920: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7930: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7950: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7960: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7970: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7980: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
7990: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
79a0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
79b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
79c0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
79d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
79e0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
79f0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7a00: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7a10: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7a20: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7a30: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7a40: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7a50: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7a70: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7a80: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
7a90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
7ac0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
7ad0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
7ae0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7af0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7b00: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7b10: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7b20: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7b30: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7b40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7b50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7b60: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7b70: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7b80: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
7b90: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
7ba0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
7bb0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
7bc0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7bd0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7be0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7bf0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7c00: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7c10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7c20: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7c30: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7c40: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7c50: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7c60: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7c70: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c80: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7c90: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ca0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7cb0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7cc0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7cd0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7ce0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7cf0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7d00: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7d10: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7d20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7d30: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7d40: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7d50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7d60: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7d70: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7d80: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7d90: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7da0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7db0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7dc0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7dd0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7de0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7df0: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7e00: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7e10: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7e20: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7e30: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7e40: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7e50: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
7e60: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
7e70: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
7e80: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
7e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ed0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
7ee0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
7ef0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
7f00: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
7f10: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
7f20: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
7f30: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
7f40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f50: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
7f60: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
7f70: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
7f80: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
7f90: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
7fa0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
7fb0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
7fc0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
7fd0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
7fe0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
7ff0: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8000: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8020: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8030: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8040: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8060: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8070: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
8080: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
8090: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
80a0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
80b0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
80c0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
80d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
80e0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
80f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8100: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8110: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8120: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8130: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8140: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8150: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8160: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8170: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
8180: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
8190: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
81a0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
81b0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
81c0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
81d0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
81e0: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69  E_TEST.  int nHi
81f0: 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20  t, nMiss;       
8200: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
8210: 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a  ts and missing *
8220: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e  /.  int nRead, n
8230: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
8240: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
8250: 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a  s read/written *
8260: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
8270: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
8280: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
8290: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
82a0: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
82b0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
82c0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
82d0: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
82e0: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
82f0: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
8300: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
8310: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28  data */.  void (
8320: 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29  *xCodecSizeChng)
8330: 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b  (void*,int,int);
8340: 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61   /* Notify of pa
8350: 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  ge size changes 
8360: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
8370: 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20  ecFree)(void*); 
8380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
8390: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
83a0: 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69  e codec */.  voi
83b0: 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20  d *pCodec;      
83c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
83d0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
83e0: 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20  odec... methods 
83f0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72  */.#endif.  char
8400: 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20   *pTmpSpace;    
8410: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
8420: 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  .pageSize bytes 
8430: 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70  of space for tmp
8440: 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65   use */.  PCache
8450: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
8460: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8470: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
8480: 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66  bject */.#ifndef
8490: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
84a0: 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20  .  Wal *pWal;   
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
84c0: 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  * Write-ahead lo
84d0: 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e  g used by "journ
84e0: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a  al_mode=wal" */.
84f0: 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20    char *zWal;   
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8510: 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77   File name for w
8520: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a  rite-ahead log *
8530: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8540: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8550: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8560: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8570: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8580: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8590: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
85a0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
85b0: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
85c0: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
85d0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
85e0: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
85f0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8600: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8610: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8620: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8630: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8640: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8650: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8660: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8670: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8680: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8690: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
86a0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
86b0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
86c0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
86d0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
86e0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
86f0: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8700: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8710: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8720: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8730: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8740: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8750: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8760: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8770: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8780: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8790: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
87a0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
87b0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
87c0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
87d0: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
87e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
87f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8800: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8810: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8820: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8830: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8840: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8850: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8860: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8870: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8880: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8890: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
88a0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
88b0: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
88c0: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
88d0: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
88e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
88f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8900: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8910: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8920: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8930: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8940: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8950: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8960: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8970: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8980: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8990: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
89a0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
89b0: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
89c0: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
89d0: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
89e0: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
89f0: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8a00: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8a10: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8a20: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8a30: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8a40: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8a50: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
8a60: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
8a70: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
8a80: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
8a90: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
8aa0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8ab0: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
8ac0: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
8ad0: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
8ae0: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
8af0: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
8b00: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
8b10: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
8b20: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
8b30: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
8b40: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
8b50: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
8b60: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
8b70: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
8b80: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
8b90: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
8ba0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
8bb0: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
8bc0: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
8bd0: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
8be0: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
8bf0: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
8c00: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
8c10: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
8c20: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
8c30: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
8c40: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
8c50: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
8c60: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
8c70: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
8c80: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
8c90: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
8ca0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
8cb0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
8cc0: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
8cd0: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
8ce0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8cf0: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
8d00: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
8d10: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
8d20: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
8d30: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
8d40: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
8d50: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
8d60: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
8d70: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
8d80: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
8d90: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
8da0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
8db0: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
8dc0: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
8dd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8de0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
8df0: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
8e00: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
8e10: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
8e20: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
8e30: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
8e40: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
8e50: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
8e60: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
8e70: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
8e80: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
8e90: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
8ea0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
8eb0: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
8ec0: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
8ed0: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
8ee0: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
8ef0: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
8f00: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
8f10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
8f20: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
8f30: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
8f40: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
8f50: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
8f60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
8f70: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
8f80: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
8f90: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
8fa0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
8fb0: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
8fc0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
8fd0: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
8fe0: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
8ff0: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
9000: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
9010: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9020: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
9030: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
9040: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
9050: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
9060: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
9070: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
9080: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
9090: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
90a0: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
90b0: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
90c0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
90d0: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
90e0: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
90f0: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
9100: 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a  )->pMethods)../*
9110: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
9120: 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73  if this pager us
9130: 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64  es a write-ahead
9140: 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20   log instead of 
9150: 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c  the usual.** rol
9160: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f  lback journal. O
9170: 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a  therwise false..
9180: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
9190: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69  E_OMIT_WAL.stati
91a0: 63 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61  c int pagerUseWa
91b0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
91c0: 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  {.  return (pPag
91d0: 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a  er->pWal!=0);.}.
91e0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
91f0: 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a  agerUseWal(x) 0.
9200: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f  # define pagerRo
9210: 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23  llbackWal(x) 0.#
9220: 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c   define pagerWal
9230: 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a  Frames(v,w,x,y,z
9240: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9250: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
9260: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
9270: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
9280: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
9290: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
92a0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
92b0: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
92c0: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
92d0: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
92e0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
92f0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  );.**.** This fu
9300: 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79  nction runs many
9310: 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20   asserts to try 
9320: 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73  to find inconsis
9330: 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68  tencies in.** th
9340: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
9350: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
9360: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
9370: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
9380: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
9390: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
93a0: 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61  r = p;..  /* Sta
93b0: 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  te must be valid
93c0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
93d0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
93e0: 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70  OPEN.       || p
93f0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9400: 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c  READER.       ||
9410: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9420: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
9430: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9440: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9450: 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
9460: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9470: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
9480: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
9490: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
94a0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
94b0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
94c0: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
94d0: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64   );..  /* Regard
94e0: 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72  less of the curr
94f0: 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d  ent state, a tem
9500: 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  p-file connectio
9510: 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73  n always behaves
9520: 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68  .  ** as if it h
9530: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
9540: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9550: 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65  base file. It ne
9560: 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a  ver updates.  **
9570: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
9580: 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68  ter field, so th
9590: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
95a0: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
95b0: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
95c0: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
95d0: 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d  ==0 || p->eLock=
95e0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
95f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9600: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
9610: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9620: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20  ntDone );..  /* 
9630: 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61  If the useJourna
9640: 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  l flag is clear,
9650: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9660: 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e  e must be "OFF".
9670: 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68   .  ** And if th
9680: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
9690: 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75  s "OFF", the jou
96a0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e  rnal file must n
96b0: 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f  ot be open..  */
96c0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
96d0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
96e0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
96f0: 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61   || p->useJourna
9700: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
9710: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
9720: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9730: 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28  _OFF || !isOpen(
9740: 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  p->jfd) );..  /*
9750: 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44   Check that MEMD
9760: 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63  B implies noSync
9770: 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  . And an in-memo
9780: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  ry journal. Sinc
9790: 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61  e .  ** this mea
97a0: 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ns an in-memory 
97b0: 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e  pager performs n
97c0: 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20  o IO at all, it 
97d0: 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72  cannot encounter
97e0: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51   .  ** either SQ
97f0: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
9800: 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67  LITE_FULL during
9810: 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69   rollback or whi
9820: 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20  le finalizing . 
9830: 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   ** a journal fi
9840: 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68  le. (although th
9850: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
9860: 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nal implementati
9870: 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74  on may .  ** ret
9880: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9890: 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65  _NOMEM while the
98a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
98b0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e   being written).
98c0: 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65   It .  ** is the
98d0: 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69  refore not possi
98e0: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  ble for an in-me
98f0: 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e  mory pager to en
9900: 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20  ter the ERROR . 
9910: 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a   ** state..  */.
9920: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
9930: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f     assert( p->no
9940: 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65  Sync );.    asse
9950: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9960: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9970: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
9980: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9990: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
99a0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
99b0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
99c0: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50  rt( p->eState!=P
99d0: 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d  AGER_ERROR && p-
99e0: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
99f0: 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  PEN );.    asser
9a00: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
9a10: 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )==0 );.  }..  /
9a20: 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74  * If changeCount
9a30: 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52  Done is set, a R
9a40: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20  ESERVED lock or 
9a50: 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
9a60: 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  held.  ** on the
9a70: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
9a80: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68  sert( pPager->ch
9a90: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30  angeCountDone==0
9aa0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
9ab0: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9ac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9ad0: 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  >eLock!=PENDING_
9ae0: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63  LOCK );..  switc
9af0: 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a  h( p->eState ){.
9b00: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f      case PAGER_O
9b10: 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72  PEN:.      asser
9b20: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
9b30: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9b40: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9b50: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9b60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
9b70: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
9b80: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
9b90: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
9ba0: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72  File );.      br
9bb0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9bc0: 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20  AGER_READER:.   
9bd0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9be0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9bf0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9c00: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9c10: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
9c20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9c30: 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
9c40: 4c 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61  LOCK || p->noRea
9c50: 64 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62  dlock );.      b
9c60: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9c70: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9c80: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
9c90: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9ca0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9cb0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9cc0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9cd0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9ce0: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9cf0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9d00: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9d10: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9d20: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
9d30: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9d40: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
9d50: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
9d60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9d70: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9d80: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
9d90: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
9da0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9db0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
9dc0: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
9dd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9de0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
9df0: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
9e00: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9e10: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
9e20: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
9e30: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9e40: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9e60: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9e70: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9e80: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
9e90: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9ea0: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
9eb0: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
9ec0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
9ed0: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
9ee0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
9ef0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
9f00: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
9f10: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
9f20: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
9f30: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
9f40: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
9f50: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
9f60: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
9f70: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
9f80: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
9f90: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
9fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9fb0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
9fc0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
9fd0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
9fe0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
9ff0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a000: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a010: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a020: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a030: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a040: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a050: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
a060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a070: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a080: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a090: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
a0a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a0b0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a0c0: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
a0d0: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a0e0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a0f0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
a100: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
a110: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a120: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a130: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a140: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a150: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a160: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a170: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a190: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
a1a0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a1b0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a1c0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a1d0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a1e0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a1f0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a200: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a210: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a220: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a230: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a240: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a250: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
a260: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a270: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a280: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a290: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
a2a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2b0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a2c0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a2d0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a2e0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a2f0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a300: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a310: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a320: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
a330: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
a340: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a350: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a360: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a370: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a380: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a390: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a3a0: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a3b0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a3c0: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
a3d0: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
a3e0: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a3f0: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
a400: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
a410: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
a420: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
a430: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
a440: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
a450: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
a460: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
a470: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
a480: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a490: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a4a0: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
a4b0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a4c0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
a4d0: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
a4e0: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
a4f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a500: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  }..  return 1;.}
a510: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
a520: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75   pointer to a hu
a530: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72  man readable str
a540: 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20  ing in a static 
a550: 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69  buffer.** contai
a560: 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f  ning the state o
a570: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
a580: 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  ct passed as an 
a590: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a  argument. This.*
a5a0: 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  * is intended to
a5b0: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
a5c0: 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65  debuggers. For e
a5d0: 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c  xample, as an al
a5e0: 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20  ternative.** to 
a5f0: 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20  "print *pPager" 
a600: 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67  in gdb:.**.** (g
a610: 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c  db) printf "%s",
a620: 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61   print_pager_sta
a630: 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74  te(pPager).*/.st
a640: 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74  atic char *print
a650: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
a660: 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63  er *p){.  static
a670: 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d   char zRet[1024]
a680: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
a690: 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74  rintf(1024, zRet
a6a0: 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d  ,.      "Filenam
a6b0: 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20  e:      %s\n".  
a6c0: 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20      "State:     
a6d0: 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25      %s errCode=%
a6e0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b  d\n".      "Lock
a6f0: 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22  :          %s\n"
a700: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20  .      "Locking 
a710: 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d  mode:  locking_m
a720: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
a730: 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20  "Journal mode:  
a740: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c  journal_mode=%s\
a750: 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e  n".      "Backin
a760: 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c  g store: tempFil
a770: 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73  e=%d memDb=%d us
a780: 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20  eJournal=%d\n". 
a790: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20       "Journal:  
a7a0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d       journalOff=
a7b0: 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d  %lld journalHdr=
a7c0: 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53  %lld\n".      "S
a7d0: 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62  ize:          db
a7e0: 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69  size=%d dbOrigSi
a7f0: 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65  ze=%d dbFileSize
a800: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70  =%d\n".      , p
a810: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20  ->zFilename.    
a820: 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50    , p->eState==P
a830: 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20  AGER_OPEN       
a840: 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a       ? "OPEN" :.
a850: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a860: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
a870: 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44           ? "READ
a880: 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ER" :.        p-
a890: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
a8a0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f  RITER_LOCKED   ?
a8b0: 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22   "WRITER_LOCKED"
a8c0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a8d0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a8e0: 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57  ER_CACHEMOD ? "W
a8f0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20  RITER_CACHEMOD" 
a900: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a910: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
a920: 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52  R_DBMOD    ? "WR
a930: 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20  ITER_DBMOD" :.  
a940: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a950: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
a960: 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52  NISHED ? "WRITER
a970: 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20  _FINISHED" :.   
a980: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a990: 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20  PAGER_ERROR     
a9a0: 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20        ? "ERROR" 
a9b0: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
a9c0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43    , (int)p->errC
a9d0: 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ode.      , p->e
a9e0: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20  Lock==NO_LOCK   
a9f0: 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b        ? "NO_LOCK
aa00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
aa10: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
aa20: 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45  OCK   ? "RESERVE
aa30: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
aa40: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
aa50: 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53  _LOCK  ? "EXCLUS
aa60: 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70  IVE" :.        p
aa70: 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
aa80: 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52  LOCK     ? "SHAR
aa90: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
aaa0: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
aab0: 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f  LOCK    ? "UNKNO
aac0: 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  WN" : "?error?".
aad0: 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75        , p->exclu
aae0: 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c  siveMode ? "excl
aaf0: 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c  usive" : "normal
ab00: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  ".      , p->jou
ab10: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab20: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
ab30: 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20  RY   ? "memory" 
ab40: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
ab50: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab60: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab70: 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20       ? "off" :. 
ab80: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
ab90: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aba0: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
abb0: 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20    ? "delete" :. 
abc0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
abd0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
abe0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
abf0: 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a    ? "persist" :.
ac00: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ac10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ac20: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
ac30: 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20  TE ? "truncate" 
ac40: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
ac50: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ac60: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
ac70: 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22       ? "wal" : "
ac80: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
ac90: 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c   (int)p->tempFil
aca0: 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62  e, (int)p->memDb
acb0: 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75  , (int)p->useJou
acc0: 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e  rnal.      , p->
acd0: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a  journalOff, p->j
ace0: 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
acf0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65  , (int)p->dbSize
ad00: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67  , (int)p->dbOrig
ad10: 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62  Size, (int)p->db
ad20: 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20  FileSize.  );.. 
ad30: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
ad40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
ad50: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
ad60: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
ad70: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
ad80: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
ad90: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
ada0: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
adb0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
adc0: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
add0: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
ade0: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
adf0: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
ae00: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
ae10: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
ae20: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
ae30: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
ae40: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
ae50: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
ae60: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
ae70: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
ae80: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
ae90: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
aea0: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
aeb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aec0: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
aed0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
aee0: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
aef0: 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
af00: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
af10: 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ager;.  int i;. 
af20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
af30: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
af40: 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
af50: 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
af60: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
af70: 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  t[i];.    if( p-
af80: 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20  >nOrig>=pgno && 
af90: 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63  0==sqlite3Bitvec
afa0: 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  Test(p->pInSavep
afb0: 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  oint, pgno) ){. 
afc0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
afd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
afe0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
aff0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
b000: 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
b010: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b020: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
b030: 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  int pageInJourna
b040: 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  l(PgHdr *pPg){. 
b050: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b060: 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70  itvecTest(pPg->p
b070: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
b080: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
b090: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
b0a0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
b0b0: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
b0c0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
b0d0: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
b0e0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
b0f0: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
b100: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
b110: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
b120: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
b130: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b140: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b150: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
b160: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
b170: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
b180: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b190: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
b1a0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b1b0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
b1c0: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
b1d0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
b1e0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
b1f0: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
b200: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
b210: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
b220: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
b230: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
b240: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
b250: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b260: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b270: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b280: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
b290: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
b2a0: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
b2b0: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
b2c0: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
b2d0: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
b2e0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b2f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b300: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
b310: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b320: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
b330: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
b340: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
b350: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b360: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
b370: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
b380: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b390: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b3a0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
b3b0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
b3c0: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
b3d0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
b3e0: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
b3f0: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
b400: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
b410: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
b420: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
b430: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
b440: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
b450: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
b460: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
b470: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
b480: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
b490: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
b4a0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
b4b0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
b4c0: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
b4d0: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
b4e0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
b4f0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
b500: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
b510: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
b520: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
b530: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
b540: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
b550: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
b560: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
b570: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
b580: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
b590: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
b5a0: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
b5b0: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
b5c0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
b5d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b5e0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
b5f0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
b600: 4d 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Mode );.  assert
b610: 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ( eLock==NO_LOCK
b620: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45   || eLock==SHARE
b630: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
b640: 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  rt( eLock!=NO_LO
b650: 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61  CK || pagerUseWa
b660: 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
b670: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
b680: 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
b690: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b6a0: 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock>=eLock );.
b6b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b6c0: 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
b6d0: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
b6e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
b6f0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
b700: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
b710: 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b  ->eLock = eLock;
b720: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
b730: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
b740: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
b750: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
b760: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b770: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
b780: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
b790: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
b7a0: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
b7b0: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
b7c0: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
b7d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
b7e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
b7f0: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
b800: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
b810: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
b820: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
b830: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
b840: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
b850: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
b860: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
b870: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
b880: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
b890: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
b8a0: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
b8b0: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
b8c0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
b8d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
b8e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
b8f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
b900: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
b910: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
b920: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b930: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
b940: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
b950: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
b960: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
b970: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
b980: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
b990: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
b9a0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
b9b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
b9c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
b9d0: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
b9e0: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
b9f0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
ba00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
ba10: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
ba20: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ock);.    if( rc
ba30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
ba40: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55  pPager->eLock!=U
ba50: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f  NKNOWN_LOCK||eLo
ba60: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
ba70: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  CK) ){.      pPa
ba80: 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ger->eLock = eLo
ba90: 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ck;.      IOTRAC
baa0: 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
bab0: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
bac0: 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
bad0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bae0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
baf0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
bb00: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
bb10: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
bb20: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
bb30: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
bb40: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
bb50: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
bb60: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
bb70: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
bb80: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
bb90: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
bba0: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
bbb0: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
bbc0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
bbd0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
bbe0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
bbf0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
bc00: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
bc10: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
bc20: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
bc30: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
bc40: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
bc50: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
bc60: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
bc70: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
bc80: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
bc90: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
bca0: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
bcb0: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
bcc0: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
bcd0: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
bce0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
bcf0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
bd00: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
bd10: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
bd20: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
bd30: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
bd40: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
bd50: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
bd60: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
bd70: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
bd80: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
bd90: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
bda0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
bdb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
bdc0: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
bdd0: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
bde0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
bdf0: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
be00: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
be10: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
be20: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
be50: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
be60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
be70: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
be80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
be90: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
bea0: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
bed0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
bee0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
bef0: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
bf00: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
bf10: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
bf20: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
bf30: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
bf40: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
bf50: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
bf60: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
bf70: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
bf80: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
bf90: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
bfa0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
bfb0: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
bfc0: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
bfd0: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
bfe0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
bff0: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
c000: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
c010: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
c020: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
c030: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
c040: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
c050: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
c060: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
c070: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
c080: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
c090: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
c0a0: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
c0b0: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
c0c0: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
c0d0: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
c0e0: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
c0f0: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
c100: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
c110: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
c120: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
c130: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
c140: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
c150: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
c160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
c170: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
c180: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
c190: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
c1a0: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
c1b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
c1c0: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
c1d0: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
c1e0: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
c1f0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
c200: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
c210: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
c220: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c230: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
c240: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
c250: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
c260: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
c270: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
c280: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
c290: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
c2a0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c2b0: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
c2c0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
c2d0: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
c2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
c2f0: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
c300: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
c310: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
c320: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
c330: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
c340: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
c350: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
c360: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
c370: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
c380: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
c390: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
c3a0: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
c3b0: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
c3c0: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
c3d0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
c3e0: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
c3f0: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
c400: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
c410: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
c420: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
c430: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
c440: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
c450: 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  r->errCode.     
c460: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
c470: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
c480: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
c490: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c4a0: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
c4b0: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
c4c0: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
c4d0: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
c4e0: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
c4f0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c500: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
c510: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
c520: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
c530: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
c540: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
c550: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
c560: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
c570: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
c580: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
c590: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c5a0: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
c5b0: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
c5c0: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
c5d0: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
c5e0: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
c5f0: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
c600: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
c610: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
c620: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
c630: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
c640: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
c650: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
c660: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
c670: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
c680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
c690: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
c6a0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
c6b0: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
c6c0: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
c6d0: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
c6e0: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
c6f0: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
c700: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
c710: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
c720: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
c730: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
c740: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c750: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
c760: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
c770: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
c780: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
c790: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
c7a0: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
c7b0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
c7c0: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
c7d0: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
c7e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c7f0: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
c800: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
c810: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
c820: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c830: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
c840: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
c850: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
c860: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
c870: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
c880: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
c890: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
c8a0: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
c8b0: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
c8c0: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
c8d0: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
c8e0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
c8f0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
c900: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
c910: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
c920: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c930: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
c940: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
c950: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
c960: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
c970: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
c980: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
c990: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
c9a0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
c9b0: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
c9c0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
c9d0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
c9e0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
c9f0: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
ca00: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
ca10: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
ca20: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
ca30: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
ca40: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ca50: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
ca60: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
ca70: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
ca80: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
ca90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
caa0: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
cad0: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
cae0: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
caf0: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb10: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
cb20: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
cb30: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
cb40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cb50: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
cb60: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
cb70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
cb80: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
cb90: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
cba0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
cbb0: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
cbc0: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
cbd0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
cbe0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
cbf0: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
cc00: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
cc10: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
cc20: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
cc30: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
cc40: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
cc50: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
cc60: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
cc70: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
cc80: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
cc90: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
cca0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
ccb0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
ccc0: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
ccd0: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
cce0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
ccf0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
cd00: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
cd10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
cd20: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
cd30: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
cd40: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
cd50: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
cd60: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
cd70: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
cd80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cd90: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
cda0: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
cdb0: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
cdc0: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
cdd0: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
cde0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
cdf0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
ce00: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
ce10: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
ce20: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
ce30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
ce40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ce50: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
ce60: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
ce70: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
ce80: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
ce90: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
cea0: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
ceb0: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
cec0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
ced0: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
cee0: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
cef0: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
cf00: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
cf10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cf20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
cf30: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
cf40: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
cf50: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
cf60: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
cf70: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
cf80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cf90: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
cfa0: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
cfb0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
cfc0: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
cfd0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
cfe0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
cff0: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
d000: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
d010: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
d020: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
d050: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
d060: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
d070: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
d080: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d090: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
d0b0: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0d0: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
d0e0: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
d0f0: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
d100: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
d110: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
d120: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
d130: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
d140: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
d150: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
d160: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
d170: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
d180: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
d190: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
d1a0: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
d1b0: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
d1c0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
d1d0: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
d1e0: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
d1f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d200: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
d210: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
d220: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d230: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
d240: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
d250: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d260: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d270: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
d280: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
d290: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
d2a0: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
d2b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
d2c0: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
d2d0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
d2e0: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
d2f0: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
d300: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
d310: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d320: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
d330: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
d340: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d350: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d360: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
d370: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
d380: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
d390: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
d3a0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
d3b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
d3c0: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
d3d0: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
d3e0: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
d3f0: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
d400: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
d410: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
d420: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
d430: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
d440: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
d450: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
d460: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
d470: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
d480: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
d490: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
d4a0: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
d4b0: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
d4c0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
d4d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
d4e0: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
d4f0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
d500: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
d510: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
d520: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
d530: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
d540: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
d550: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
d560: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
d570: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
d580: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
d590: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
d5a0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
d5b0: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
d5c0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
d5d0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
d5e0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
d5f0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
d600: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
d610: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
d620: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
d630: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
d640: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d670: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
d680: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
d690: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
d6a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
d6b0: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
d6c0: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
d6d0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
d6e0: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
d6f0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
d700: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
d710: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
d720: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
d730: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
d740: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
d750: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
d760: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
d770: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
d780: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d790: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
d7a0: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
d7b0: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
d7c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
d7d0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
d7e0: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
d7f0: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
d800: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
d810: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
d820: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
d830: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d840: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
d850: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
d860: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
d870: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
d880: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
d890: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
d8a0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
d8b0: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
d8c0: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
d8d0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
d8e0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
d8f0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
d900: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
d910: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
d920: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
d930: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
d940: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
d950: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
d960: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
d970: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
d980: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
d990: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
d9a0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
d9b0: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
d9c0: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
d9d0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
d9e0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
d9f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
da00: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
da10: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
da20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
da30: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
da40: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
da50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
da60: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
da70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
da80: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
da90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
daa0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
dab0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
dac0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
dad0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
dae0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
daf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
db00: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
db10: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
db20: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
db30: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
db40: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
db50: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
db60: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
db70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
db80: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
db90: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
dba0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
dbb0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
dbc0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
dbd0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
dbe0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
dbf0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
dc00: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
dc10: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
dc20: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
dc30: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
dc40: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
dc50: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
dc60: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
dc70: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
dc80: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
dc90: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
dca0: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
dcb0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
dcc0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
dcd0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
dce0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
dcf0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
dd00: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
dd10: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
dd20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dd30: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
dd40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
dd50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dd60: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
dd70: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dd80: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
dd90: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
dda0: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
ddb0: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
ddc0: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
ddd0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
dde0: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
ddf0: 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f  >pageSize;     /
de00: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
de10: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
de20: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
de30: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
de60: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
de70: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
dea0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
deb0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
dec0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
ded0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
dee0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
def0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
df00: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
df10: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
df20: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
df30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
df40: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
df50: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
df60: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
df70: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
df80: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
df90: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
dfa0: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
dfb0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
dfc0: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
dfd0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
dfe0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
dff0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
e000: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
e010: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
e020: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
e030: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
e040: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
e050: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
e060: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e070: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e080: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e090: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e0a0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e0b0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e0c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e0d0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e0e0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e0f0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e100: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e110: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e120: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e130: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e140: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e150: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e160: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e170: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e180: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e190: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e1a0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e1b0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e1c0: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e1d0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e1e0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e1f0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e200: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e210: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e220: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e230: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e240: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e250: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e260: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e270: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e280: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e290: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e2a0: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e2b0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e2c0: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e2d0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e2e0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e2f0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e300: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
e310: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
e320: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
e330: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
e340: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
e350: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
e360: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
e370: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
e380: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
e390: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
e3a0: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
e3b0: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
e3c0: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
e3d0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e3e0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
e3f0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
e400: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
e410: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
e420: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
e430: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
e440: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e450: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
e460: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
e470: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
e480: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
e490: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
e4a0: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
e4b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
e4c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e4d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e4e0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
e4f0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
e500: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
e510: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
e520: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e530: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e540: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
e550: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
e560: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
e570: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
e580: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e590: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
e5a0: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
e5b0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
e5c0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e5d0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
e5e0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e5f0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e600: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
e610: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
e620: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
e630: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
e640: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
e650: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
e660: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
e670: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
e680: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
e690: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
e6a0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
e6b0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
e6c0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
e6d0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e6e0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e6f0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
e700: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
e710: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
e720: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
e730: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e740: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e750: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
e760: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
e770: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
e780: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
e790: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
e7a0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e7b0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e7c0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
e7d0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
e7e0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
e7f0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
e800: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e810: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e820: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
e830: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
e840: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
e850: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
e860: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
e870: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
e880: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
e890: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
e8a0: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
e8b0: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
e8c0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
e8d0: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
e8e0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
e8f0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
e900: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
e910: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
e920: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
e930: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
e940: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
e950: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e960: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
e970: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
e980: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e990: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
e9a0: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
e9b0: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
e9c0: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
e9d0: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
e9e0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e9f0: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
ea00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ea10: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
ea20: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
ea30: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
ea40: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
ea50: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
ea60: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
ea70: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
ea80: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
ea90: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
eaa0: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
eab0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
eac0: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
ead0: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
eae0: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
eaf0: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
eb00: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
eb10: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
eb20: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
eb30: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
eb40: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
eb50: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
eb60: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
eb70: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
eb80: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
eb90: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
eba0: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
ebb0: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
ebc0: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
ebd0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
ebe0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
ebf0: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
ec00: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
ec10: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
ec20: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
ec30: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
ec40: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
ec50: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
ec60: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
ec70: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
ec80: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
ec90: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
eca0: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
ecb0: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
ecc0: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
ecd0: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
ece0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
ecf0: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
ed00: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
ed10: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
ed20: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
ed30: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
ed40: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
ed50: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
ed60: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ed70: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
ed80: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
ed90: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
eda0: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
edb0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
edc0: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
edd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ede0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
edf0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
ee00: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
ee10: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
ee20: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ee30: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
ee40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ee50: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ee60: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
ee70: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
ee80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ee90: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
eea0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
eeb0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
eec0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
eed0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
eee0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
eef0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
ef00: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
ef10: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
ef20: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
ef30: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
ef40: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
ef50: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
ef60: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
ef70: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
ef80: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
ef90: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
efa0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
efb0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
efc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
efd0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
efe0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
eff0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
f000: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
f010: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
f020: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
f030: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
f040: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
f050: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
f060: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
f070: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f080: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f090: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f0a0: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f0b0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f0c0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f0d0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f0e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f0f0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f100: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f110: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f120: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f130: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f140: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f150: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f160: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f170: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f180: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f190: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f1a0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f1b0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f1c0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f1d0: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f1e0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f200: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f210: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f230: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f240: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f250: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f270: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f280: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f290: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f2a0: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f2b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f2c0: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f2d0: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f2e0: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f2f0: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f300: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f310: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
f320: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
f330: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f360: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
f370: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
f380: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
f390: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
f3a0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
f3b0: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f3d0: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
f3e0: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
f3f0: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
f400: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f410: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
f420: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
f430: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
f440: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
f450: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
f460: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f470: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
f480: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
f490: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
f4a0: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
f4b0: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
f4c0: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
f4d0: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
f4e0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
f4f0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
f500: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
f510: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
f520: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
f530: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
f540: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f550: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
f560: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
f570: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f580: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
f590: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
f5a0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
f5b0: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
f5c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f5d0: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
f5e0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
f5f0: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
f600: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
f610: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
f620: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
f630: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
f640: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
f650: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
f660: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f670: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
f680: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
f690: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
f6a0: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
f6b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
f6c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f6d0: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
f6e0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
f6f0: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
f700: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
f710: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
f720: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f730: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
f740: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
f750: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
f760: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
f770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f790: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f7a0: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
f7b0: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
f7c0: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
f7d0: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
f7e0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
f7f0: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
f800: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
f810: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
f820: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
f830: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
f840: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
f850: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
f860: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
f870: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f880: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f890: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
f8a0: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
f8b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f8c0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f8d0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f8e0: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
f8f0: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
f900: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f910: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f920: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f930: 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
f940: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
f950: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
f960: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f970: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
f980: 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
f990: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
f9a0: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
f9b0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
f9c0: 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
f9d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
f9e0: 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
f9f0: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
fa00: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
fa10: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
fa20: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
fa30: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
fa40: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
fa50: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
fa60: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fa70: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fa80: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
fa90: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
faa0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fab0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fac0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fad0: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
fae0: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
faf0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fb00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
fb10: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
fb20: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fb30: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fb40: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
fb50: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
fb60: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
fb70: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
fb80: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
fb90: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
fba0: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
fbb0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
fbc0: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
fbd0: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
fbe0: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
fbf0: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
fc00: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
fc10: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
fc20: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
fc30: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
fc40: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
fc50: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
fc60: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
fc70: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
fc80: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
fc90: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
fca0: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
fcb0: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
fcc0: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
fcd0: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
fce0: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
fcf0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
fd00: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
fd10: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
fd20: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
fd30: 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
fd40: 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
fd50: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
fd60: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
fd70: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
fd80: 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
fd90: 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
fda0: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
fdb0: 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
fdc0: 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
fdd0: 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
fde0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
fdf0: 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
fe00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fe10: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
fe20: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
fe30: 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
fe40: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
fe50: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
fe60: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
fe70: 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
fe80: 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
fe90: 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
fea0: 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
feb0: 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
fec0: 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
fed0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
fee0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
fef0: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
ff00: 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
ff10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ff20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ff30: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
ff40: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
ff50: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
ff60: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
ff70: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
ff80: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
ff90: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
ffa0: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
ffb0: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
ffc0: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
ffd0: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
ffe0: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
fff0: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
10000 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
10010 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
10020 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
10030 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
10040 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
10050 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
10060 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
10070 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
10080 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
10090 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
100a0 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
100b0 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
100c0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
100d0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
100e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
100f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
10100 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
10110 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10120 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
10130 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
10140 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
10150 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
10160 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
10170 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
10180 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
10190 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
101a0 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
101b0 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
101c0 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
101d0 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
101e0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
101f0 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
10200 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
10210 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
10220 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
10230 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
10240 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
10250 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
10260 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
10270 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
10280 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
10290 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
102a0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
102b0 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
102c0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
102d0 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
102e0 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
102f0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
10300 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10310 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
10320 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
10330 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
10340 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
10350 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
10360 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
10370 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
10380 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
10390 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
103a0 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
103b0 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
103c0 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
103d0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
103e0 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
103f0 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
10400 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
10410 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
10420 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
10430 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10440 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
10450 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
10460 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
10470 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
10480 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
104b0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
104c0 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
104d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
104e0 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
104f0 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
10500 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10520 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
10530 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
10540 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
10550 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
10560 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10570 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
10580 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
10590 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
105b0 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
105c0 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
105d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
105e0 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
105f0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
10600 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
10610 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
10620 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
10630 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
10640 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10650 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70  _MEMORY .   || p
10660 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10670 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10680 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a  LMODE_OFF .  ){.
10690 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
106a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
106b0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
106c0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  1;.  assert( isO
106d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
106e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
106f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10700 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
10710 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20  nalOff );..  /* 
10720 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65  Calculate the le
10730 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e  ngth in bytes an
10740 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  d the checksum o
10750 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66  f zMaster */.  f
10760 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d  or(nMaster=0; zM
10770 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20  aster[nMaster]; 
10780 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20  nMaster++){.    
10790 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
107a0 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a  [nMaster];.  }..
107b0 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
107c0 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
107d0 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
107e0 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
107f0 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
10800 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10810 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
10820 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
10830 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
10840 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
10850 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
10860 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
10870 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
10880 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
10890 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
108a0 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
108b0 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
108c0 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
108d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
108e0 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  Off;..  /* Write
108f0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10900 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20  nal data to the 
10910 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
10920 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a  al file. If.  **
10930 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10940 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
10950 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
10960 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  aller..  */.  if
10970 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  ( (0 != (rc = wr
10980 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
10990 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20  ->jfd, iHdrOff, 
109a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
109b0 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28  ager)))).   || (
109c0 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
109d0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
109e0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
109f0 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66  nMaster, iHdrOff
10a00 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  +4))).   || (0 !
10a10 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10a20 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10a30 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10a40 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20  er, nMaster))). 
10a50 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10a60 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10a70 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a80 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63  f+4+nMaster+4, c
10a90 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30  ksum))).   || (0
10aa0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10ab0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10ac0 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
10ad0 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b  gic, 8, iHdrOff+
10ae0 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
10af0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10b00 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
10b10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
10b20 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
10b30 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
10b40 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
10b50 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
10b60 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
10b70 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
10b80 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
10b90 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
10ba0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10bb0 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
10bc0 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
10bd0 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
10be0 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
10bf0 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
10c00 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
10c10 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
10c20 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
10c30 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
10c40 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
10c50 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
10c60 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
10c70 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
10c80 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
10c90 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
10ca0 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
10cb0 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
10cc0 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
10cd0 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
10ce0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
10cf0 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
10d00 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
10d10 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
10d20 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
10d30 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
10d40 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
10d50 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
10d60 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
10d70 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
10d80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10d90 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
10da0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
10db0 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
10dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10dd0 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
10de0 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
10df0 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
10e00 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
10e10 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
10e20 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
10e30 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
10e40 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
10e50 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
10e60 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
10e70 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
10e80 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
10e90 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
10ea0 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
10ed0 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
10ee0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
10ef0 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
10f00 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
10f10 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
10f20 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
10f30 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
10f40 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
10f50 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
10f60 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
10f70 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
10f80 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
10f90 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
10fa0 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
10fb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
10fc0 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
10fd0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
10fe0 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
10ff0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11000 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
11010 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11020 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
11030 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
11040 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ckup);.  sqlite3
11050 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
11060 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
11070 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11080 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11090 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
110a0 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
110b0 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
110c0 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
110d0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
110e0 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
110f0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
11100 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
11110 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
11120 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11130 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
11140 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
11150 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
11160 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11170 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11180 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11190 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
111a0 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
111b0 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
111c0 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
111d0 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
111e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
111f0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11200 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
11210 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
11220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
11230 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
11240 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d  de || sqlite3IsM
11250 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
11260 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
11270 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
11280 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
11290 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
112a0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
112b0 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
112c0 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
112d0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
112e0 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
112f0 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
11300 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11310 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
11320 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
11330 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
11340 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
11350 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
11360 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
11370 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11380 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
11390 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
113a0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
113b0 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
113c0 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
113d0 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
113e0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
113f0 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11420 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
11430 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
11440 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
11450 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
11460 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
11470 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
11480 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
11490 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
114a0 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
114b0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
114c0 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
114d0 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
114e0 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
114f0 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
11500 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
11510 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
11520 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
11530 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
11540 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11550 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
11560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11570 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11580 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
11590 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
115a0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
115b0 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
115c0 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
115d0 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
115e0 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
115f0 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
11600 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
11610 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
11620 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
11630 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
11640 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
11650 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
11660 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
11670 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
11680 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
11690 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
116a0 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
116b0 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
116c0 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
116d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
116e0 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
116f0 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
11700 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11710 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
11720 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
11730 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
11740 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
11750 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
11760 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
11770 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
11780 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
11790 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
117a0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
117b0 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
117c0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
117d0 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
117e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
117f0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
11800 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
11810 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
11820 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
11830 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
11840 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
11850 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
11860 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
11870 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
11880 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
11890 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
118a0 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
118b0 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
118c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
118d0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
118e0 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
118f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11900 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
11910 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
11920 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
11930 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
11940 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
11950 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
11960 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
11970 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
11980 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
11990 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
119a0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
119b0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
119c0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
119d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
119e0 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
119f0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
11a00 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
11a10 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
11a20 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
11a30 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
11a40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11a50 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11a80 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
11a90 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
11aa0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
11ab0 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
11ac0 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
11ad0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11ae0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
11af0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
11b00 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11b10 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
11b20 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
11b30 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
11b40 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
11b50 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
11b60 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11b70 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
11b80 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
11b90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
11ba0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
11bb0 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
11bc0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
11bd0 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
11be0 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
11bf0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11c00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
11c10 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
11c20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11c30 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
11c40 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
11c50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11c60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11c70 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
11c80 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11c90 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11ca0 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
11cb0 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11cc0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11cd0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
11ce0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
11cf0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11d00 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
11d10 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
11d20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
11d30 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
11d40 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
11d50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
11d60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
11d70 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
11d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
11d90 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
11da0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11db0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11dc0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11dd0 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
11de0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
11df0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
11e00 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
11e10 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
11e20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
11e30 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
11e40 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
11e50 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
11e60 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
11e70 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
11e80 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
11e90 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
11ea0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
11eb0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
11ec0 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
11ed0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11ee0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
11ef0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
11f00 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
11f10 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
11f20 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
11f30 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
11f40 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
11f50 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
11f60 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
11f70 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
11f80 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
11f90 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
11fa0 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
11fb0 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
11fc0 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
11fd0 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
11fe0 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
11ff0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
12000 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
12010 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
12020 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
12030 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
12040 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
12050 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12060 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12070 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12080 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12090 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
120a0 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
120b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
120c0 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
120d0 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
120e0 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
120f0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12100 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
12110 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
12120 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
12130 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
12140 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
12150 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
12160 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12170 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12180 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12190 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
121a0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
121b0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
121c0 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
121d0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
121e0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
121f0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
12200 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
12210 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12220 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
12230 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12240 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12250 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
12260 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
12270 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12280 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
12290 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
122a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
122b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
122c0 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45   whenever an IOE
122d0 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  RR or FULL error
122e0 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a   that requires.*
122f0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74  * the pager to t
12300 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74  ransition into t
12310 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d  he ERROR state m
12320 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64  ay ahve occurred
12330 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  ..** The first a
12340 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
12350 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
12360 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
12370 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20   second .** the 
12380 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
12390 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
123a0 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
123b0 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a  unction. The .**
123c0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
123d0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
123e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
123f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
12400 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
12410 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12420 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c   is SQLITE_FULL,
12430 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
12440 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49   one of the.** I
12450 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20  OERR sub-codes, 
12460 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
12470 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12480 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
12490 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ode.** is stored
124a0 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64   in Pager.errCod
124b0 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  e. While the pag
124c0 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68  er remains in th
124d0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a  e ERROR state,.*
124e0 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20  * all major API 
124f0 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67  calls on the Pag
12500 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
12510 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72  ely return Pager
12520 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 20 45 78 63  .errCode..** Exc
12530 65 70 74 2c 20 69 66 20 74 68 65 20 65 72 72 6f  ept, if the erro
12540 72 2d 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r-code is SQLITE
12550 5f 46 55 4c 4c 2c 20 63 61 6c 6c 73 20 74 6f 20  _FULL, calls to 
12560 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 20 61 6e  PagerLookup() an
12570 64 0a 2a 2a 20 50 61 67 65 72 41 63 71 75 69 72  d.** PagerAcquir
12580 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73  e are handled as
12590 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 65   if the pager we
125a0 72 65 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  re in PAGER_READ
125b0 45 52 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ER state..**.** 
125c0 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  The ERROR state 
125d0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
125e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
125f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
12600 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
12610 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
12620 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
12630 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
12640 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
12650 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12660 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
12670 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
12680 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
12690 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
126a0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
126b0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
126c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
126d0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
126e0 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
126f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12700 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12710 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
12720 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
12730 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
12740 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
12750 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12760 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
12770 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
12780 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
12790 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
127a0 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
127b0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
127c0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
127d0 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
127e0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
127f0 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
12800 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
12810 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
12820 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
12830 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55  ( rc2==SQLITE_FU
12840 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54  LL || rc2==SQLIT
12850 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70  E_IOERR ){.    p
12860 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12870 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
12880 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12890 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
128a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
128b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
128c0 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
128d0 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
128e0 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
128f0 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
12900 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
12910 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
12920 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
12930 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
12940 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
12950 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
12960 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
12970 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
12980 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
12990 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
129a0 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
129b0 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
129c0 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
129d0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
129e0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
129f0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
12a00 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
12a10 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
12a20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
12a30 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
12a40 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
12a50 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
12a60 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
12a70 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
12a80 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
12a90 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
12aa0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
12ab0 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
12ac0 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
12ad0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
12ae0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
12af0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
12b00 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
12b10 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
12b20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
12b30 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
12b40 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
12b50 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
12b60 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
12b70 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
12b80 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
12b90 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
12ba0 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
12bb0 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
12bc0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
12bd0 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
12be0 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
12bf0 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
12c00 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
12c10 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
12c20 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
12c30 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
12c40 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
12c50 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
12c60 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
12c70 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
12c80 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12c90 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
12ca0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
12cb0 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
12cc0 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
12cd0 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
12ce0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
12cf0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
12d00 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
12d10 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
12d20 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
12d30 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
12d40 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
12d50 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12d60 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
12d70 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
12d80 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
12d90 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
12da0 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
12db0 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
12dc0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
12dd0 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
12de0 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
12df0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
12e00 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
12e10 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
12e20 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
12e30 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
12e40 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12e50 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
12e60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12e70 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
12e80 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
12e90 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
12ea0 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
12eb0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12ec0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12ed0 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
12ee0 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
12ef0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
12f00 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
12f10 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
12f20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
12f30 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
12f40 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
12f50 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
12f60 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
12f70 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
12f80 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
12f90 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
12fa0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
12fb0 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
12fc0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12fd0 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
12fe0 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
12ff0 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
13000 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
13010 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
13020 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
13030 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
13040 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
13050 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
13060 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
13070 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
13080 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
13090 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
130a0 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
130b0 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
130c0 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
130d0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
130e0 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
130f0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
13100 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
13110 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13120 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
13130 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
13140 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
13150 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13160 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
13170 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
13180 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
13190 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
131a0 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
131b0 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
131c0 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
131d0 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
131e0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
131f0 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
13200 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
13210 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
13220 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
13230 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
13240 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
13250 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
13260 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
13270 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
13280 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
13290 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
132a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
132b0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
132c0 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
132d0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
132e0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
132f0 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
13300 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13310 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
13320 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
13330 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
13340 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
13350 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
13360 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
13370 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
13380 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
13390 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
133a0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
133b0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
133c0 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
133d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
133e0 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
133f0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
13400 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
13410 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
13420 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
13430 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
13440 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
13450 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
13460 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
13470 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
13480 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
13490 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
134a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
134b0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
134c0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
134d0 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
134e0 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
134f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
13500 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
13510 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
13520 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
13530 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
13540 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
13550 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13560 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
13570 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
13580 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
13590 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
135a0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
135b0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
135c0 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
135d0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
135e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
135f0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
13600 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
13610 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
13620 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
13630 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
13640 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
13650 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
13660 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
13670 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
13680 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13690 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
136a0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
136b0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
136c0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
136d0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
136e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
136f0 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
13700 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
13710 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
13720 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
13730 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
13740 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13750 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
13760 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
13770 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
13780 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
13790 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
137a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
137b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
137c0 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ORY );.      sql
137d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
137e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
137f0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13800 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13810 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
13820 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
13830 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13840 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
13850 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13860 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
13870 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13880 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
13890 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
138a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
138b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
138c0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
138d0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
138e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
138f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
13900 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
13910 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
13920 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
13930 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
13940 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13950 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
13960 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
13970 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
13980 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
13990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
139a0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
139b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
139c0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
139d0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
139e0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
139f0 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
13a00 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
13a10 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
13a20 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
13a30 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
13a40 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
13a50 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
13a60 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
13a70 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
13a80 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
13a90 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
13aa0 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
13ab0 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
13ac0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a  emory journal. .
13ad0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
13ae0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13af0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13b00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
13b10 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
13b20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13b30 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13b40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13b50 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
13b60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13b70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13b80 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
13b90 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
13ba0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13bb0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
13bc0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
13bd0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
13be0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
13bf0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
13c00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
13c10 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
13c20 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
13c30 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
13c40 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  S.    sqlite3Pca
13c50 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
13c60 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
13c70 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
13c80 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ash);.#endif.  }
13c90 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
13ca0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
13cb0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
13cc0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13cd0 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
13ce0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
13cf0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
13d00 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
13d10 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
13d20 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
13d30 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
13d40 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
13d50 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
13d60 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
13d70 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
13d80 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
13d90 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
13da0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
13db0 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
13dc0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
13dd0 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
13de0 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
13df0 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
13e00 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
13e10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13e20 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
13e30 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
13e40 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
13e50 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
13e60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
13e70 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
13e80 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
13e90 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
13ea0 65 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72  e .   && (!pager
13eb0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c  UseWal(pPager) |
13ec0 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  | sqlite3WalExcl
13ed0 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
13ee0 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b  ->pWal, 0)).  ){
13ef0 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
13f00 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
13f10 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
13f20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
13f30 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
13f40 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53    }.  pPager->eS
13f50 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
13f60 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  DER;.  pPager->s
13f70 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  etMaster = 0;.. 
13f80 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
13f90 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
13fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
13fb0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
13fc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13fd0 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
13fe0 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
13ff0 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
14000 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
14010 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
14020 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14030 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  , do not attempt
14040 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63   .** the rollbac
14050 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  k at this time. 
14060 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75  Instead, pager_u
14070 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  nlock() is calle
14080 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  d. The.** call t
14090 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
140a0 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c   will discard al
140b0 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  l in-memory page
140c0 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65  s, unlock.** the
140d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
140e0 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  nd move the page
140f0 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  r back to OPEN s
14100 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a  tate. If this .*
14110 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
14120 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  re is a hot-jour
14130 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20  nal left in the 
14140 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65  file-system, the
14150 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63   next .** connec
14160 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61  tion to obtain a
14170 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
14180 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68  the pager (which
14190 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65   may be this one
141a0 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20  ) .** will roll 
141b0 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
141c0 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
141d0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65  not already ente
141e0 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
141f0 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f  ate, but an IO o
14200 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  r.** malloc erro
14210 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
14220 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  a rollback, then
14230 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c   this will itsel
14240 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20  f cause .** the 
14250 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
14260 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
14270 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c  Which will be cl
14280 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  eared by the.** 
14290 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
142a0 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72  lock(), as descr
142b0 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73  ibed above..*/.s
142c0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
142d0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
142e0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
142f0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
14300 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
14310 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ROR && pPager->e
14320 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
14330 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
14340 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
14350 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
14360 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
14370 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
14380 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  TER_LOCKED ){.  
14390 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
143a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
143b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
143c0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
143d0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
143e0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
143f0 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ();.    }else if
14400 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
14410 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
14420 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14430 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
14440 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20  READER );.      
14450 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
14460 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29  ction(pPager, 0)
14470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
14480 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
14490 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
144a0 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
144b0 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
144c0 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
144d0 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
144e0 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
144f0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
14500 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
14510 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
14520 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
14530 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
14540 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
14550 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14560 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
14570 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
14580 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
14590 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
145a0 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
145b0 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
145c0 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
145d0 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
145e0 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
145f0 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
14600 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
14610 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
14620 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
14630 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
14640 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
14650 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
14660 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
14670 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
14680 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
14690 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
146a0 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
146b0 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
146c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
146d0 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
146e0 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
146f0 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
14700 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
14710 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
14720 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
14730 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
14740 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14750 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
14760 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
14770 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
14780 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
14790 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
147a0 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
147b0 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
147c0 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
147d0 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
147e0 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
147f0 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
14800 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
14810 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
14820 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
14830 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
14840 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
14850 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
14860 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
14870 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
14880 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
14890 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
148a0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
148b0 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
148c0 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
148d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
148e0 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
148f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
14900 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
14910 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
14920 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
14930 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
14940 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
14950 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
14960 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
14970 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
14980 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
14990 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
149a0 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
149b0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
149c0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
149d0 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
149e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
149f0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
14a00 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
14a10 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
14a20 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
14a30 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
14a40 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
14a70 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
14a80 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
14a90 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
14aa0 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
14ab0 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
14ac0 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
14ad0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
14ae0 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
14af0 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
14b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
14b10 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
14b20 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
14b30 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
14b40 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
14b50 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
14b60 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
14b70 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
14b80 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
14b90 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
14ba0 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
14bb0 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
14bc0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
14bd0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
14be0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
14bf0 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  ** The main roll
14c00 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
14c10 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  s checksums - th
14c20 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
14c30 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74  nal does .** not
14c40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
14c50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
14c60 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
14c70 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
14c80 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
14c90 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
14ca0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
14cb0 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
14cc0 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
14cd0 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
14ce0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
14cf0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
14d00 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
14d10 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
14d20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
14d30 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
14d40 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
14d50 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
14d60 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
14d70 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
14d80 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
14d90 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
14da0 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
14db0 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
14dc0 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
14dd0 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
14de0 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
14df0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
14e00 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
14e10 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
14e20 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
14e30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14e40 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
14e50 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
14e60 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
14e70 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
14e80 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
14e90 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
14ea0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
14eb0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
14ec0 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
14ed0 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
14ee0 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
14ef0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
14f00 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
14f10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14f20 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
14f30 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
14f40 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
14f50 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
14f60 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
14f70 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
14f80 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
14f90 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
14fa0 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
14fb0 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
14fc0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
14fd0 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
14fe0 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
14ff0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
15000 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
15010 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
15020 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
15030 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
15040 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
15050 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
15060 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
15070 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
15080 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
15090 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
150a0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
150b0 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
150c0 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
150d0 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
150e0 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
150f0 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
15100 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
15110 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
15120 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15130 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
15140 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
15150 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
15160 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
15170 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
15180 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
15190 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
151a0 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
151b0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
151c0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
151d0 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
151e0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
151f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15210 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
15220 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
15230 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
15260 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
15270 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
15280 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
15290 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
152a0 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
152b0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
152c0 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
152e0 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
152f0 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
15300 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
15310 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
15320 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15330 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
15340 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
15350 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
15360 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
15370 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
15380 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
15390 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
153a0 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
153c0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
153d0 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
153e0 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
153f0 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
15400 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
15410 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
15420 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
15430 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
15460 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
15470 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
15480 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
15490 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
154a0 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
154b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
154c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
154d0 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
154e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
154f0 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
15500 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
15510 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
15520 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
15530 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
15540 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
15550 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
15560 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
15570 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
15580 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15590 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
155a0 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
155b0 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
155c0 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
155d0 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
155e0 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
155f0 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
15600 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
15610 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
15620 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
15630 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
15640 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
15650 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
15660 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
15670 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
15680 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
15690 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
156a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
156b0 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
156c0 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
156d0 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
156e0 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
156f0 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
15700 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
15710 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
15720 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
15730 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
15740 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
15750 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
15760 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
15770 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15780 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
15790 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
157a0 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
157b0 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
157c0 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
157d0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
157e0 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
157f0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
15800 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
15810 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
15820 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
15830 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
15840 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15850 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
15860 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
15870 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
15880 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
15890 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
158a0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
158b0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
158c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
158d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
158e0 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
158f0 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
15900 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
15910 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
15920 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
15930 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
15940 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
15950 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
15960 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
15970 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
15980 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
15990 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
159a0 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
159b0 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
159c0 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
159d0 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
159e0 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
159f0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15a00 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
15a10 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
15a20 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
15a30 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
15a40 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
15a50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15a60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
15a70 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
15a80 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
15a90 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
15aa0 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
15ab0 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
15ac0 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
15ad0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
15ae0 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
15af0 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
15b00 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
15b10 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
15b20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
15b30 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
15b40 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
15b50 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
15b60 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
15b70 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
15b80 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
15b90 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
15ba0 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
15bb0 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
15bc0 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
15bd0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
15be0 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
15bf0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
15c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
15c10 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
15c20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
15c30 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
15c40 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
15c50 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
15c60 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
15c70 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
15c80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15c90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
15ca0 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
15cb0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
15cc0 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
15cd0 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
15ce0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15cf0 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
15d00 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
15d10 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
15d20 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
15d30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15d40 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
15d50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
15d60 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
15d70 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
15d80 20 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e   by before durin
15d90 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
15da0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
15db0 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
15dc0 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
15dd0 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
15de0 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
15df0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
15e00 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
15e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
15e30 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
15e40 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
15e50 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
15e60 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
15e70 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
15e80 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
15e90 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
15ea0 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
15eb0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
15ec0 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
15ed0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
15ee0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
15ef0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
15f00 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
15f10 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
15f20 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
15f30 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
15f40 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
15f50 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
15f60 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
15f70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
15f80 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
15f90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15fa0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
15fb0 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
15fc0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
15fd0 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
15fe0 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
15ff0 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
16000 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
16010 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
16020 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
16030 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
16040 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
16050 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
16060 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
16070 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
16080 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
16090 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
160a0 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
160b0 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
160c0 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
160d0 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
160e0 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
160f0 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
16100 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
16110 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
16120 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
16130 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
16140 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
16150 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
16160 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
16170 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
16180 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
16190 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
161a0 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
161b0 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
161c0 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
161d0 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
161e0 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
161f0 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
16200 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
16210 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
16220 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
16230 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
16240 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
16250 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
16260 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
16270 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
16280 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
16290 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
162a0 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
162b0 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
162c0 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
162d0 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
162e0 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
162f0 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
16300 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
16310 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
16320 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
16330 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
16340 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
16350 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
16360 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
16370 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
16380 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
16390 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
163a0 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
163b0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
163c0 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
163d0 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
163e0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
163f0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
16400 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
16410 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
16420 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
16430 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
16440 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
16450 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
16460 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
16470 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
16480 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
16490 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
164a0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
164b0 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
164c0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
164d0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
164e0 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
164f0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
16500 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
16510 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
16520 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
16530 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
16540 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
16550 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
16560 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
16570 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
16580 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
16590 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
165a0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
165b0 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
165c0 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
165d0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
165e0 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
165f0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
16600 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
16610 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
16620 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
16630 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
16640 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
16650 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
16660 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
16670 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
16680 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
16690 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
166a0 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
166b0 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
166c0 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
166d0 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
166e0 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
166f0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
16700 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
16710 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
16720 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
16730 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
16740 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
16750 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
16760 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
16770 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
16780 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
16790 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
167a0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
167b0 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b  PEN || pPg==0 );
167c0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
167d0 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
167e0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25   %d hash(%08x) %
167f0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
16800 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
16810 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
16820 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
16830 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44  ageSize, (u8*)aD
16840 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ata),.          
16850 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61   (isMainJrnl?"ma
16860 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62  in-journal":"sub
16870 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b  -journal").  ));
16880 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
16890 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  l ){.    isSynce
168a0 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  d = pPager->noSy
168b0 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20  nc || (*pOffset 
168c0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
168d0 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  alHdr);.  }else{
168e0 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
168f0 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70  (pPg==0 || 0==(p
16900 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
16910 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20  R_NEED_SYNC));. 
16920 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28   }.  if( isOpen(
16930 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26  pPager->fd).   &
16940 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
16950 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
16960 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
16970 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
16980 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e  PEN).   && isSyn
16990 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  ced.  ){.    i64
169a0 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29   ofst = (pgno-1)
169b0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
169c0 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74  geSize;.    test
169d0 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74  case( !isSavepnt
169e0 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70   && pPg!=0 && (p
169f0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
16a00 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b  NEED_SYNC)!=0 );
16a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
16a20 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
16a30 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) );.    rc = sq
16a40 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
16a50 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44  ger->fd, (u8*)aD
16a60 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
16a70 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
16a80 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
16a90 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
16aa0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
16ab0 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
16ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16ad0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
16ae0 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
16af0 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
16b00 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
16b10 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
16b20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
16b30 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
16b40 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
16b50 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
16b60 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
16b70 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
16b80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
16b90 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
16ba0 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
16bb0 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
16bc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16bd0 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
16be0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
16bf0 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
16c00 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
16c10 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
16c20 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16c30 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
16c40 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
16c50 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
16c60 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
16c70 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
16c80 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
16c90 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
16ca0 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
16cb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16cc0 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
16cd0 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
16ce0 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
16cf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
16d00 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
16d10 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
16d20 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
16d30 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
16d40 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
16d50 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
16d60 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
16d70 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
16d80 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
16d90 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
16da0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
16db0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
16dc0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
16dd0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
16de0 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
16df0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
16e00 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
16e10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
16e20 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
16e30 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
16e40 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
16e50 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
16e60 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
16e70 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
16e80 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
16e90 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
16ea0 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
16eb0 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
16ec0 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
16ed0 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
16ee0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
16ef0 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
16f00 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
16f10 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
16f20 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
16f30 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
16f40 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
16f50 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
16f60 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ill==0 );.    pP
16f70 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
16f80 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ++;.    rc = sql
16f90 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
16fa0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
16fb0 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pPg, 1);.    ass
16fc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
16fd0 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20  otSpill==1 );.  
16fe0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
16ff0 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20  pill--;.    if( 
17000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17010 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
17020 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
17030 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
17040 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17050 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
17060 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
17070 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
17080 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
17090 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
170a0 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
170b0 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
170c0 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
170d0 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
170e0 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
170f0 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
17100 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
17110 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
17120 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
17130 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
17140 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
17150 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
17160 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
17170 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
17180 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
17190 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
171a0 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  rRollback()..   
171b0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
171c0 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  ata;.    pData =
171d0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
171e0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28   memcpy(pData, (
171f0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
17200 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17210 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
17220 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ter(pPg);.    if
17230 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  ( isMainJrnl && 
17240 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a  (!isSavepnt || *
17250 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d  pOffset<=pPager-
17260 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a  >journalHdr) ){.
17270 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
17280 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
17290 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20   page were just 
172a0 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68  restored from th
172b0 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a  e main .      **
172c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
172d0 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hen its content 
172e0 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20  must be as they 
172f0 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20  were when the . 
17300 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
17310 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70  ion was first op
17320 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
17330 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74  se we can mark t
17340 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
17350 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65   as clean, since
17360 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   there will be n
17370 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  o need to write 
17380 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20  it out to the.  
17390 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
173a0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
173b0 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
173c0 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69  exception to thi
173d0 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70  s rule. If the p
173e0 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  age is being rol
173f0 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  led.      ** bac
17400 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73  k as part of a s
17410 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61  avepoint (or sta
17420 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b  tement) rollback
17430 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20   from an .      
17440 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  ** unsynced port
17450 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ion of the main 
17460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17470 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  en it is not saf
17480 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e.      ** to ma
17490 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
174a0 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65  lean. This is be
174b0 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68  cause marking th
174c0 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20  e page as.      
174d0 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c  ** clean will cl
174e0 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
174f0 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69  ED_SYNC flag. Si
17500 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a  nce the page is.
17510 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
17520 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
17530 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69  file (recorded i
17540 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
17550 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  al) and.      **
17560 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
17570 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65  SYNC flag is cle
17580 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67  ared, if the pag
17590 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  e is written to.
175a0 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
175b0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
175c0 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  action, it will 
175d0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
175e0 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  ty but.      ** 
175f0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
17600 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f  YNC flag will no
17610 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75  t be set. It cou
17620 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61  ld then potentia
17630 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  lly.      ** be 
17640 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f  written out into
17650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17660 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f  le before its jo
17670 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20  urnal file.     
17680 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73   ** segment is s
17690 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73  ynced. If a cras
176a0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
176b0 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  or following thi
176c0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  s,.      ** data
176d0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
176e0 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20  may ensue..     
176f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
17700 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
17710 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
17720 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
17730 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
17740 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
17750 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
17760 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
17770 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
17780 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
17790 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
177a0 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
177b0 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
177c0 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
177d0 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
177e0 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
177f0 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
17800 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
17810 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
17820 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
17830 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
17840 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
17850 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
17860 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
17870 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
17880 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
17890 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
178a0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
178b0 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
178c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
178d0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
178e0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
178f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17900 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
17910 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
17920 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
17930 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
17940 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
17950 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
17960 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
17970 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17980 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
17990 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
179a0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
179b0 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
179c0 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
179d0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
179e0 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
179f0 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
17a00 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
17a10 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
17a20 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
17a30 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
17a40 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
17a50 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
17a60 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
17a70 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
17a80 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
17a90 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
17aa0 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
17ab0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
17ac0 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
17ad0 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
17ae0 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
17af0 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
17b00 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
17b10 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
17b20 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
17b30 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
17b40 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
17b50 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
17b60 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
17b70 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
17b80 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
17b90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
17ba0 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
17bb0 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
17bc0 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
17bd0 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
17be0 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
17bf0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
17c00 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
17c10 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
17c20 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
17c30 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
17c40 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
17c50 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
17c60 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
17c70 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
17c80 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
17c90 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
17ca0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
17cb0 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
17cc0 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
17cd0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
17ce0 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
17cf0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
17d00 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
17d10 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
17d20 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
17d30 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
17d40 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
17d50 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
17d60 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
17d70 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
17d80 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
17d90 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
17da0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
17db0 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
17dc0 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
17dd0 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
17de0 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
17df0 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
17e00 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
17e10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
17e20 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
17e30 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
17e40 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
17e50 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
17e60 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
17e70 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
17e80 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
17e90 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
17ea0 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
17eb0 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
17ec0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
17ed0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
17ee0 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
17ef0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
17f00 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
17f10 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
17f20 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
17f30 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
17f40 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
17f50 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
17f60 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
17f70 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
17f80 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
17f90 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
17fa0 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
17fb0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
17fc0 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
17fd0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
17fe0 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
17ff0 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
18000 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
18010 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
18020 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18030 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
18040 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
18050 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
18060 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
18070 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
18080 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
18090 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
180a0 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
180b0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
180c0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
180d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
180e0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
180f0 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
18120 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
18130 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
18140 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
18150 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18160 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
18170 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
18180 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
18190 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
181a0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
181b0 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
181c0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
181d0 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
181e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
181f0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
18200 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
18210 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
18220 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18230 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
18240 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
18250 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
18260 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69  ne journal withi
18270 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63  n MJ file */.  c
18280 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b  har *zMasterPtr;
18290 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
182a0 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c  e to hold MJ fil
182b0 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75  ename from a jou
182c0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
182d0 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20  nt nMasterPtr;  
182e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75           /* Amou
182f0 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  nt of space allo
18300 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72  cated to zMaster
18310 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41  Ptr[] */..  /* A
18320 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
18330 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
18340 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
18350 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
18360 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
18370 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
18380 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18390 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
183a0 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
183b0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
183c0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
183d0 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
183e0 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
183f0 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
18400 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
18410 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
18420 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
18430 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
18440 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
18460 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
18470 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
18480 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
18490 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
184a0 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
184b0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
184c0 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
184d0 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
184e0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
184f0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
18500 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f  master_out;..  /
18510 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
18520 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18530 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
18540 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
18550 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
18560 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
18570 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
18580 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62  urnal.   Also ob
18590 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63  tain.  ** suffic
185a0 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a  ient space (in z
185b0 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f  MasterPtr) to ho
185c0 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ld the names of 
185d0 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72  master.  ** jour
185e0 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63  nal files extrac
185f0 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72  ted from regular
18600 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
18610 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ls..  */.  rc = 
18620 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
18630 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
18640 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
18650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18660 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
18670 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72  r_out;.  nMaster
18680 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
18690 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73  thname+1;.  zMas
186a0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
186b0 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29  ite3Malloc((int)
186c0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
186d0 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
186e0 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ;.  if( !zMaster
186f0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72  Journal ){.    r
18700 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18710 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61  ;.    goto delma
18720 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  ster_out;.  }.  
18730 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
18740 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
18750 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
18760 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18770 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
18780 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69  asterJournal, (i
18790 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
187a0 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  l, 0);.  if( rc!
187b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
187c0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
187d0 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
187e0 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
187f0 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e  ] = 0;..  zJourn
18800 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
18810 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a  nal;.  while( (z
18820 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
18830 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
18840 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
18850 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63  t exists;.    rc
18860 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
18870 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
18880 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
18890 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
188a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
188b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
188c0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
188d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
188e0 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
188f0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
18900 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
18910 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
18920 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
18930 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65  ts..      ** Ope
18940 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
18950 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
18960 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18970 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73  l. If.      ** s
18980 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
18990 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
189a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
189b0 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
189c0 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
189d0 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
189e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
189f0 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
18a00 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
18a10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18a20 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
18a30 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
18a40 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
18a50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18a60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
18a70 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18a80 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18a90 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
18aa0 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
18ab0 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
18ac0 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
18ad0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
18ae0 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
18af0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18b00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
18b10 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18b20 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18b30 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
18b40 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
18b50 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
18b60 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69  ter)==0;.      i
18b70 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
18b80 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
18b90 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
18ba0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
18bb0 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
18bc0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
18bd0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
18be0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75  }.    }.    zJou
18bf0 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33  rnal += (sqlite3
18c00 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61  Strlen30(zJourna
18c10 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73  l)+1);.  }. .  s
18c20 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
18c30 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  aster);.  rc = s
18c40 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
18c50 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
18c60 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
18c70 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
18c80 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
18c90 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20  ;.  if( pMaster 
18ca0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
18cb0 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
18cc0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
18cd0 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b  pen(pJournal) );
18ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18cf0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
18d00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18d10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
18d20 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
18d30 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61  change the actua
18d40 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
18d50 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
18d60 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
18d70 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  em. This only ha
18d80 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69  ppens when commi
18d90 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
18da0 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69  ion,.** or rolli
18db0 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ng back a transa
18dc0 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67  ction (including
18dd0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
18de0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a  hot-journal)..**
18df0 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
18e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
18e10 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68   not open, or th
18e20 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
18e30 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f  n either.** DBMO
18e40 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
18e50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
18e60 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
18e70 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a  wise, the size .
18e80 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
18e90 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61  s changed to nPa
18ea0 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a  ge pages (nPage*
18eb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18ec0 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20   bytes). .** If 
18ed0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
18ee0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
18ef0 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
18f00 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
18f10 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
18f20 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
18f30 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
18f40 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
18f50 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
18f60 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
18f70 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
18f80 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
18f90 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
18fa0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
18fb0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
18fc0 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
18fd0 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
18fe0 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
18ff0 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
19000 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
19010 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
19020 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
19030 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
19040 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
19050 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
19060 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
19070 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
19080 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
19090 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
190a0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
190b0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
190c0 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
190d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
190e0 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
190f0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
19100 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
19110 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
19120 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
19130 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
19140 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
19150 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
19160 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19170 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
19180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19190 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
191a0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20  R_READER );.  . 
191b0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
191c0 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28  er->fd) .   && (
191d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
191e0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
191f0 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
19200 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
19210 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ) .  ){.    i64 
19220 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
19230 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Size;.    assert
19240 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
19250 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
19260 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  );.    /* TODO: 
19270 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
19280 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
19290 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
192a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
192b0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
192c0 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
192d0 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
192e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
192f0 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
19300 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19310 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
19320 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
19330 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
19340 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
19350 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19360 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
19370 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19380 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
19390 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
193a0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
193b0 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20  ger->fd, "", 1, 
193c0 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20  newSize-1);.    
193d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
193e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
193f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
19400 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
19410 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
19420 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
19440 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
19450 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
19460 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
19470 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
19480 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
19490 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
194a0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
194b0 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
194c0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
194d0 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
194e0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
194f0 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  d used .** to de
19500 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
19510 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
19520 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
19530 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
19540 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
19550 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
19560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
19570 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
19580 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
19590 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
195a0 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
195b0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
195c0 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
195d0 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
195e0 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
195f0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
19600 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
19610 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
19620 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
19630 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33   rounded up to 3
19640 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
19650 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72  ss than 32, or r
19660 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d  ounded down to M
19670 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
19680 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  f it.** is great
19690 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54  er than MAX_SECT
196a0 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  OR_SIZE..*/.stat
196b0 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
196c0 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
196d0 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
196e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
196f0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
19700 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
19710 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
19720 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
19730 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
19740 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
19750 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
19760 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
19770 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
19780 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
19790 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
197a0 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
197b0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
197c0 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
197d0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
197e0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
197f0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
19800 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
19810 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
19820 73 65 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b  sectorSize<32 ){
19830 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
19840 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
19850 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
19860 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  >sectorSize>MAX_
19870 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
19880 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53     assert( MAX_S
19890 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20  ECTOR_SIZE>=512 
198a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
198b0 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f  ectorSize = MAX_
198c0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
198d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
198e0 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
198f0 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
19900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19910 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
19920 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
19930 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
19940 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
19950 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
19960 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
19970 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
19980 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
19990 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
199a0 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
199b0 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
199c0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
199d0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
199e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
199f0 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
19a00 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
19a10 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
19a20 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
19a30 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
19a40 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
19a50 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
19a60 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
19a70 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
19a80 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
19a90 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
19aa0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
19ab0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
19ac0 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
19ad0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
19ae0 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
19af0 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
19b00 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19b10 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
19b20 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
19b30 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
19b40 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
19b50 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62  *  (5)  4 byte b
19b60 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
19b70 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
19b80 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65  ector size.  The
19b90 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20   header.**      
19ba0 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79   is this many by
19bb0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
19bc0 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67   (6)  4 byte big
19bd0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19be0 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67  which is the pag
19bf0 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20  e size..**  (7) 
19c00 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75   zero padding ou
19c10 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  t to the next se
19c20 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  ctor size..**  (
19c30 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  8)  Zero or more
19c40 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
19c50 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
19c60 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
19c70 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
19c80 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
19c90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19ca0 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
19cb0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
19cc0 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
19cd0 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
19ce0 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
19cf0 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
19d00 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65   the first 7 ite
19d10 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
19d20 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
19d30 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
19d40 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68  tance of the 8th
19d50 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
19d60 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
19d70 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
19d80 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
19d90 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19da0 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
19db0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
19dc0 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
19dd0 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
19de0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
19df0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
19e00 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
19e10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
19e20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
19e30 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
19e40 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
19e50 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
19e60 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
19e70 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
19e80 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
19e90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
19ea0 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
19eb0 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
19ec0 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
19ed0 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
19ee0 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
19ef0 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
19f00 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
19f10 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
19f20 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
19f30 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
19f40 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
19f50 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
19f60 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
19f70 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
19f80 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
19f90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
19fa0 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
19fb0 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
19fc0 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
19fd0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
19fe0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
19ff0 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
1a000 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
1a010 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
1a020 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
1a030 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
1a040 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
1a050 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
1a060 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
1a070 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
1a080 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
1a090 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
1a0a0 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
1a0b0 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
1a0c0 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
1a0d0 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
1a0e0 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
1a0f0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1a100 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
1a110 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
1a120 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
1a130 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
1a140 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
1a150 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
1a160 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
1a170 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
1a180 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
1a190 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1a1a0 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
1a1b0 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
1a1c0 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
1a1d0 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
1a1e0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
1a1f0 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
1a200 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
1a210 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
1a220 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
1a230 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
1a240 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
1a250 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
1a260 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
1a270 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1a280 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1a290 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61  * The isHot para
1a2a0 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
1a2b0 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69  that we are tryi
1a2c0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ng to rollback a
1a2d0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74   journal.** that
1a2e0 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20   might be a hot 
1a2f0 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74  journal.  Or, it
1a300 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74   could be that t
1a310 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a  he journal is .*
1a320 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61  * preserved beca
1a330 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f  use of JOURNALMO
1a340 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f  DE_PERSIST or JO
1a350 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
1a360 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  TE..** If the jo
1a370 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20  urnal really is 
1a380 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70  hot, reset the p
1a390 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72  ager cache prior
1a3a0 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b   rolling.** back
1a3b0 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49   any content.  I
1a3c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  f the journal is
1a3d0 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65   merely persiste
1a3e0 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a  nt, no reset is.
1a3f0 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ** needed..*/.st
1a400 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
1a410 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
1a420 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
1a430 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1a440 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1a450 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
1a460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a470 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1a480 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
1a490 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
1a4a0 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
1a4b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a4c0 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
1a4d0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
1a4e0 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
1a4f0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
1a500 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
1a510 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
1a520 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1a530 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
1a540 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
1a550 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1a580 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
1a590 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
1a5a0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
1a5b0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1a5c0 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63   by sqlite3OsAcc
1a5d0 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ess() */.  char 
1a5e0 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
1a5f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
1a600 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a610 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69  le if any */.  i
1a620 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  nt needPagerRese
1a630 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
1a640 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72  to reset page pr
1a650 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67  ior to first pag
1a660 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20  e rollback */.. 
1a670 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1a680 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
1a690 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
1a6a0 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
1a6b0 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
1a6c0 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
1a6d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
1a6e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1a6f0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
1a700 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1a710 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
1a720 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
1a740 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1a750 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
1a760 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a770 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
1a780 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
1a790 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
1a7a0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1a7b0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
1a7c0 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
1a7d0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
1a7e0 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
1a7f0 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
1a800 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
1a810 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
1a820 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
1a830 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
1a840 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
1a850 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
1a860 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
1a870 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
1a880 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
1a890 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
1a8a0 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
1a8b0 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
1a8c0 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
1a8d0 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
1a8e0 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
1a8f0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1a900 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
1a910 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
1a920 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
1a930 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
1a940 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
1a950 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
1a960 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
1a970 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
1a980 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1a990 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
1a9a0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1a9b0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1a9c0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1a9d0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1a9e0 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
1a9f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1aa00 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
1aa10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1aa20 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
1aa30 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
1aa40 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
1aa50 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
1aa60 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
1aa70 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
1aa80 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1aa90 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
1aaa0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1aab0 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
1aac0 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
1aad0 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
1aae0 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
1aaf0 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
1ab00 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
1ab10 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
1ab20 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
1ab30 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
1ab40 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
1ab50 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
1ab60 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
1ab70 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
1ab80 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
1ab90 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
1aba0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
1abb0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
1abc0 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
1abd0 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
1abe0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1abf0 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
1ac00 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
1ac10 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
1ac20 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
1ac30 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66  cess must have f
1ac40 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
1ac50 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
1ac60 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
1ac70 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
1ac80 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1ac90 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
1aca0 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
1acb0 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74  dr(pPager, isHot
1acc0 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
1acd0 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
1ace0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
1acf0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ad00 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1ad10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ad20 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1ad30 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1ad40 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
1ad50 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1ad60 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1ad70 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
1ad80 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1ad90 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
1ada0 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
1adb0 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
1adc0 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
1add0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
1ade0 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
1adf0 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
1ae00 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
1ae10 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
1ae20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
1ae30 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1ae40 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
1ae50 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
1ae60 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1ae70 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
1ae80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ae90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1aea0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1aeb0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1aec0 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1aed0 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
1aee0 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
1aef0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1af00 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1af10 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
1af20 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
1af30 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
1af40 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
1af50 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
1af60 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
1af70 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
1af80 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
1af90 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
1afa0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
1afb0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
1afc0 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1afd0 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
1afe0 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
1aff0 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
1b000 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
1b010 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b020 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
1b030 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
1b040 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
1b050 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1b060 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
1b070 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
1b080 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
1b090 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20  t #2565..    ** 
1b0a0 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
1b0b0 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c  k a hot journal,
1b0c0 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20   nRec==0 always 
1b0d0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
1b0e0 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b  ext.    ** chunk
1b0f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b100 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61  contains zero pa
1b110 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  ges to be rolled
1b120 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20   back.  But.    
1b130 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** when doing a 
1b140 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65  ROLLBACK and the
1b150 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69   nRec==0 chunk i
1b160 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b  s the last chunk
1b170 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
1b180 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73  ournal, it means
1b190 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1b1a0 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
1b1b0 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a  additional.    *
1b1c0 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  * pages that nee
1b1d0 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  d to be rolled b
1b1e0 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
1b1f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b200 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20   .    ** should 
1b210 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65  be computed base
1b220 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1b230 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20   file size..    
1b240 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1b250 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
1b260 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b270 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
1b280 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1b290 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
1b2a0 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
1b2b0 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1b2c0 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
1b2d0 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
1b2e0 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1b2f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1b300 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1b310 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
1b320 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1b330 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1b340 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1b350 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
1b360 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
1b370 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1b380 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b390 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1b3a0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1b3b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
1b3c0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
1b3d0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1b3e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b3f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1b400 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1b410 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1b420 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
1b430 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
1b440 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
1b450 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
1b460 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
1b470 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  to the .    ** d
1b480 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1b490 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a  /or page cache..
1b4a0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75      */.    for(u
1b4b0 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29  =0; u<nRec; u++)
1b4c0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
1b4d0 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20  PagerReset ){.  
1b4e0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1b4f0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1b500 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65     needPagerRese
1b510 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1b520 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1b530 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1b540 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72  e(pPager,&pPager
1b550 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31  ->journalOff,0,1
1b560 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ,0);.      if( r
1b570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b580 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1b590 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1b5a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1b5b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1b5c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1b5d0 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1b5e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b5f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b600 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1b610 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1b620 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1b630 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1b640 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1b650 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1b660 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1b670 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1b680 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1b690 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1b6a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1b6b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1b6c0 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1b6d0 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1b6e0 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1b6f0 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1b700 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1b710 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1b720 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1b730 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1b740 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1b750 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1b760 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1b770 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1b780 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1b790 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b7a0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1b7b0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1b7c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1b7e0 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1b7f0 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1b800 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1b810 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1b820 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1b830 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1b840 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1b850 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1b860 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1b870 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1b880 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1b890 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1b8a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1b8b0 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1b8c0 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1b8d0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1b8e0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1b8f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1b900 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b910 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1b920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b930 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1b940 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1b950 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1b960 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
1b970 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
1b980 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1b990 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
1b9a0 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
1b9b0 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
1b9c0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1b9d0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
1b9e0 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
1b9f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1ba00 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
1ba10 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
1ba20 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
1ba30 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
1ba40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ba50 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
1ba60 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ified..  */.  as
1ba70 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72  sert(.    pPager
1ba80 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d  ->fd->pMethods==
1ba90 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ||.    sqlite3
1baa0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
1bab0 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1bac0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1bad0 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b  ED,0)>=SQLITE_OK
1bae0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  .  );..  /* If t
1baf0 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20  his playback is 
1bb00 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61  happening automa
1bb10 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73  tically as a res
1bb20 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20  ult of an IO or 
1bb30 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  .  ** malloc err
1bb40 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  or that occurred
1bb50 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
1bb60 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  e-counter was up
1bb70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20  dated but .  ** 
1bb80 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
1bb90 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69  action was commi
1bba0 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63  tted, then the c
1bbb0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20  hange-counter . 
1bbc0 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   ** modification
1bbd0 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62   may just have b
1bbe0 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66  een reverted. If
1bbf0 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   this happens in
1bc00 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a   exclusive .  **
1bc10 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73   mode, then subs
1bc20 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69  equent transacti
1bc30 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
1bc40 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1bc50 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70  will not.  ** up
1bc60 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
1bc70 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20  counter at all. 
1bc80 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f  This may lead to
1bc90 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74   cache inconsist
1bca0 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65  ency.  ** proble
1bcb0 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f  ms for other pro
1bcc0 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70  cesses at some p
1bcd0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
1bce0 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a  re. So, just.  *
1bcf0 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68  * in case this h
1bd00 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65  as happened, cle
1bd10 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  ar the changeCou
1bd20 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e  ntDone flag now.
1bd30 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1bd40 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1bd50 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
1bd60 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  le;..  if( rc==S
1bd70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bd80 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1bd90 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
1bda0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1bdb0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1bdc0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1bdd0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1bde0 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74  thname+1);.    t
1bdf0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1be00 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1be10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1be20 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
1be30 53 79 6e 63 20 0a 20 20 20 26 26 20 28 70 50 61  Sync .   && (pPa
1be40 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1be50 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1be60 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1be70 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1be80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1be90 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1bea0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
1beb0 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
1bec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1bee0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
1bef0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
1bf00 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
1bf10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1bf20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1bf30 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1bf40 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1bf50 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
1bf60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1bf70 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
1bf80 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
1bf90 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1bfa0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
1bfb0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
1bfc0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
1bfd0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1bfe0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
1bff0 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
1c000 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
1c010 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
1c020 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c030 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
1c040 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1c050 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1c060 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1c070 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1c080 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1c090 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1c0a0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1c0b0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1c0c0 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1c0d0 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1c0e0 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1c0f0 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1c100 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1c110 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1c120 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c130 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1c140 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1c150 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1c160 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c170 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1c180 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1c190 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1c1a0 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1c1b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1c1c0 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1c1d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c1e0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1c1f0 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1c200 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1c210 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1c220 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1c230 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1c240 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1c250 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1c260 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1c270 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1c280 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1c290 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1c2a0 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1c2b0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1c2c0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1c2d0 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1c2e0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1c2f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c300 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1c310 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1c320 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1c330 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1c340 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1c350 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1c360 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1c370 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1c380 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1c390 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1c3a0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61   */.  int isInWa
1c3b0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1c3c0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
1c3d0 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c  ge is in log fil
1c3e0 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1c3f0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1c400 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1c410 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1c420 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1c430 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1c440 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1c450 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1c460 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c470 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
1c480 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
1c490 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
1c4a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c4b0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1c4c0 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1c4d0 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1c4e0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
1c4f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c500 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
1c510 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
1c520 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
1c530 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
1c540 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
1c550 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
1c560 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
1c570 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  d(pPager->pWal, 
1c580 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20  pgno, &isInWal, 
1c590 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1c5a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c5b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69  =SQLITE_OK && !i
1c5c0 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36  sInWal ){.    i6
1c5d0 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1c5e0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1c5f0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1c600 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1c610 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1c620 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1c630 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1c640 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1c650 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1c660 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c670 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c680 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1c690 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1c6a0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1c6b0 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1c6c0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1c6d0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1c6e0 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1c6f0 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1c700 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1c710 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1c720 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1c730 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1c740 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1c750 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1c760 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1c770 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1c780 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1c790 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1c7a0 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1c7b0 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1c7c0 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1c7d0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1c7e0 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1c7f0 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1c800 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1c810 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1c820 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1c830 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1c840 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1c850 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1c860 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1c870 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1c880 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1c890 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1c8a0 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1c8b0 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1c8c0 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1c8d0 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1c8e0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1c8f0 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1c900 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36  sing equaling 16
1c910 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69   bytes of 0xff i
1c920 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  s vanishingly sm
1c930 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  all so.      ** 
1c940 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  we should still 
1c950 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  be ok..      */.
1c960 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
1c970 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1c980 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50   0xff, sizeof(pP
1c990 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1c9a0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1c9b0 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56       u8 *dbFileV
1c9c0 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
1c9d0 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
1c9e0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1c9f0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1ca00 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1ca10 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1ca20 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20  eVers));.    }. 
1ca30 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
1ca40 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
1ca50 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
1ca60 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
1ca70 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1ca80 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1ca90 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
1caa0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
1cab0 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
1cac0 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
1cad0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1cae0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
1caf0 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
1cb00 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1cb20 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1cb30 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1cb40 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
1cb50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1cb60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cb70 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1cb80 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1cb90 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1cba0 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1cbb0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1cbc0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1cbd0 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1cbe0 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1cbf0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1cc00 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1cc10 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1cc20 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1cc30 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1cc40 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1cc50 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1cc60 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1cc70 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1cc80 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1cc90 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1cca0 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1ccb0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1ccc0 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1ccd0 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1cce0 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1ccf0 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1cd00 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1cd10 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1cd20 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1cd30 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1cd40 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1cd50 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1cd60 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1cd70 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1cd80 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1cd90 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1cda0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1cdb0 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1cdc0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1cdd0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1cde0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1cdf0 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1ce00 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ce10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1ce20 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1ce30 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1ce40 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
1ce50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1ce60 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1ce70 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1ce80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1ce90 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1cea0 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1ceb0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1cec0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1ced0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1cee0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
1cef0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1cf00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cf10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1cf20 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1cf30 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1cf40 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1cf50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1cf60 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  /* Normally, if 
1cf70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1cf80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e   rolled back, an
1cf90 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  y backup process
1cfa0 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61  es are.  ** upda
1cfb0 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63  ted as data is c
1cfc0 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
1cfd0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1cfe0 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20  l and into the. 
1cff0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
1d000 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61  is is not genera
1d010 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74  lly possible wit
1d020 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  h a WAL database
1d030 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  , as.  ** rollba
1d040 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70  ck involves simp
1d050 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ly truncating th
1d060 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72  e log file. Ther
1d070 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20  efore, if one.  
1d080 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65  ** or more frame
1d090 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
1d0a0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1d0b0 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72  he log (and ther
1d0c0 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f  efore .  ** also
1d0d0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
1d0e0 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65   backup database
1d0f0 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  s) as part of th
1d100 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  is transaction,.
1d110 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73    ** the backups
1d120 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74   must be restart
1d130 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
1d140 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
1d150 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
1d160 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1d170 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1d180 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d190 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74   to rollback a t
1d1a0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
1d1b0 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  WAL database..*/
1d1c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1d1d0 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67  rRollbackWal(Pag
1d1e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1d1f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1d200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d210 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
1d220 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b  .  PgHdr *pList;
1d230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d240 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69     /* List of di
1d250 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76  rty pages to rev
1d260 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72  ert */..  /* For
1d270 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
1d280 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65  e cache that are
1d290 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
1d2a0 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79   or have already
1d2b0 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  .  ** been writt
1d2c0 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d  en (but not comm
1d2d0 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f  itted) to the lo
1d2e0 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f  g file, do one o
1d2f0 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c  f the .  ** foll
1d300 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
1d310 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65     + Discard the
1d320 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66   cached page (if
1d330 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f   refcount==0), o
1d340 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61  r.  **   + Reloa
1d350 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66  d page content f
1d360 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d370 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29   (if refcount>0)
1d380 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1d390 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1d3a0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
1d3b0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55  rc = sqlite3WalU
1d3c0 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
1d3d0 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  , pagerUndoCallb
1d3e0 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  ack, (void *)pPa
1d3f0 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ger);.  pList = 
1d400 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1d410 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1d420 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65  PCache);.  while
1d430 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53  ( pList && rc==S
1d440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d450 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
1d460 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1d470 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
1d480 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a  Callback((void *
1d490 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  )pPager, pList->
1d4a0 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74  pgno);.    pList
1d4b0 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
1d4c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d4d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d4e0 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20  on is a wrapper 
1d4f0 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61  around sqlite3Wa
1d500 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65  lFrames(). As we
1d510 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a  ll as logging.**
1d520 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1d530 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
1d540 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69  es headed by pLi
1d550 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  st (connected by
1d560 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69   pDirty),.** thi
1d570 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66  s function notif
1d580 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62  ies any active b
1d590 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1d5a0 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68  that the pages h
1d5b0 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20  ave.** changed. 
1d5c0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
1d5d0 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a  pagerWalFrames(.
1d5e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d600 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1d610 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  t */.  PgHdr *pL
1d620 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
1d630 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1d640 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20  f frames to log 
1d650 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63  */.  Pgno nTrunc
1d660 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1d670 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1d680 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73   size after this
1d690 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
1d6a0 20 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20   isCommit,      
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d6c0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
1d6d0 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e  a commit */.  in
1d6e0 74 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20  t sync_flags    
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d700 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
1d710 6f 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30  o OsSync() (or 0
1d720 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
1d730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1d750 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
1d760 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1d770 57 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  Wal );.  rc = sq
1d780 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
1d790 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
1d7a0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
1d7b0 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
1d7c0 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
1d7d0 2c 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29  , sync_flags.  )
1d7e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1d7f0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1d800 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1d810 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
1d820 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1d830 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1d840 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1d850 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1d860 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
1d870 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
1d880 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d890 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d8a0 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72   Begin a read tr
1d8b0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1d8c0 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   WAL..**.** This
1d8d0 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f   routine used to
1d8e0 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65   be called "page
1d8f0 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22  rOpenSnapshot()"
1d900 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65   because it esse
1d910 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73  ntially.** makes
1d920 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74   a snapshot of t
1d930 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  he database at t
1d940 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74  he current point
1d950 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65   in time and pre
1d960 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73  serves.** that s
1d970 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20  napshot for use 
1d980 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e  by the reader in
1d990 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72   spite of concur
1d9a0 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62  rently changes b
1d9b0 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65  y.** other write
1d9c0 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  rs or checkpoint
1d9d0 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
1d9e0 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  nt pagerBeginRea
1d9f0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  dTransaction(Pag
1da00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1da10 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1da40 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d  .  int changed =
1da50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1da60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
1da70 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65  che must be rese
1da80 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
1da90 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1daa0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
1dab0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1dac0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
1dad0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1dae0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a  AGER_READER );..
1daf0 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45    /* sqlite3WalE
1db00 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1db10 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  n() was not call
1db20 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ed for the previ
1db30 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ous.  ** transac
1db40 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  tion in locking_
1db50 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20  mode=EXCLUSIVE. 
1db60 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e   So call it now.
1db70 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65    If we.  ** are
1db80 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1db90 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52  =NORMAL and EndR
1dba0 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f  ead() was previo
1dbb0 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a  usly called,.  *
1dbc0 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  * the duplicate 
1dbd0 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73  call is harmless
1dbe0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1dbf0 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1dc00 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1dc10 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  al);..  rc = sql
1dc20 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64  ite3WalBeginRead
1dc30 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1dc40 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67  er->pWal, &chang
1dc50 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ed);.  if( rc==S
1dc60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 68 61 6e  QLITE_OK && chan
1dc70 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ged ){.    pager
1dc80 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1dc90 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1dca0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1dcb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1dcc0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1dcd0 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f  e transition fro
1dce0 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  m PAGER_OPEN.** 
1dcf0 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
1dd00 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69  state to determi
1dd10 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ne the size of t
1dd20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1dd30 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73  .** in pages (as
1dd40 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20  suming the page 
1dd50 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73  size currently s
1dd60 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70  tored in Pager.p
1dd70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20  ageSize)..**.** 
1dd80 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
1dd90 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
1dda0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1ddb0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1ddc0 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67  tabase.** in pag
1ddd0 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  es is stored in 
1dde0 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69  *pnPage. Otherwi
1ddf0 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
1de00 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51  e (perhaps.** SQ
1de10 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1de20 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
1de30 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
1de40 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  t unmodified..*/
1de50 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1de60 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
1de70 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a   *pPager, Pgno *
1de80 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20  pnPage){.  Pgno 
1de90 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1dea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1deb0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
1dec0 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
1ded0 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c  /* Query the WAL
1dee0 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20   sub-system for 
1def0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1df00 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65  e. The WalDbsize
1df10 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ().  ** function
1df20 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   returns zero if
1df30 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20   the WAL is not 
1df40 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72  open (i.e. Pager
1df50 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20  .pWal==0), or.  
1df60 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
1df70 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  se size is not a
1df80 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61  vailable. The da
1df90 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
1dfa0 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ot.  ** availabl
1dfb0 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73  e from the WAL s
1dfc0 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65  ub-system if the
1dfd0 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70   log file is emp
1dfe0 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61  ty or.  ** conta
1dff0 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d  ins no valid com
1e000 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
1e010 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
1e020 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1e030 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1e040 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1e050 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1e060 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  D_LOCK || pPager
1e070 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a  ->noReadlock );.
1e080 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
1e090 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
1e0a0 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
1e0b0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1e0c0 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61  size was not ava
1e0d0 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1e0e0 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a  WAL sub-system,.
1e0f0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69    ** determine i
1e100 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
1e110 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1e120 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
1e130 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68   size.  ** of th
1e140 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e150 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
1e160 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
1e170 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a  e page-size,.  *
1e180 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20  * round down to 
1e190 74 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65  the nearest page
1e1a0 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69  . Except, any fi
1e1b0 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30  le larger than 0
1e1c0 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
1e1d0 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
1e1e0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20  d to contain at 
1e1f0 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a  least one page..
1e200 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1e210 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  ==0 ){.    i64 n
1e220 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1e230 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1e240 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62   of db file in b
1e250 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  ytes */.    asse
1e260 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1e270 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1e280 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1e290 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1e2a0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1e2b0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1e2c0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1e2d0 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
1e2e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e2f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e310 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50    }.    }.    nP
1e320 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f  age = (Pgno)(n /
1e330 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1e340 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67  e);.    if( nPag
1e350 65 3d 3d 30 20 26 26 20 6e 3e 30 20 29 7b 0a 20  e==0 && n>0 ){. 
1e360 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a       nPage = 1;.
1e370 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1e380 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
1e390 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1e3a0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
1e3b0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
1e3c0 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
1e3d0 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
1e3e0 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
1e3f0 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
1e400 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
1e410 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
1e420 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
1e430 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
1e440 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1e450 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
1e460 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
1e470 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
1e480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e490 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  OK;.}.../*.** Ch
1e4a0 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c  eck if the *-wal
1e4b0 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65   file that corre
1e4c0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61  sponds to the da
1e4d0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1e4e0 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74   pPager.** exist
1e4f0 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
1e500 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f  e is not empy, o
1e510 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  r verify that th
1e520 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1e530 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28  s.** not exist (
1e540 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20  by deleting it) 
1e550 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1e560 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  file is empty..*
1e570 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1e580 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  base is not empt
1e590 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20  y and the *-wal 
1e5a0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65  file exists, ope
1e5b0 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  n the pager.** i
1e5c0 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20  n WAL mode.  If 
1e5d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1e5e0 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a  empty or if no *
1e5f0 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
1e600 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72   and.** if no er
1e610 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  ror occurs, make
1e620 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
1e630 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
1e640 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a  et to.** PAGER_J
1e650 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a  OURNALMODE_WAL..
1e660 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1e670 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72  ITE_OK or an err
1e680 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
1e690 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
1e6a0 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63  old a SHARED loc
1e6b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1e6c0 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e file to call t
1e6d0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
1e6e0 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
1e6f0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1e700 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71  e db file is req
1e710 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20  uired to delete 
1e720 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e  .** a WAL on a n
1e730 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61  one-empty databa
1e740 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  se, this ensures
1e750 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
1e760 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  e condition .** 
1e770 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63  between the xAcc
1e780 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20  ess() below and 
1e790 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
1e7a0 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
1e7b0 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f  ome .** other co
1e7c0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1e7d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1e7e0 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61  nWalIfPresent(Pa
1e7f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1e800 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e810 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
1e820 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1e830 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1e840 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1e850 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1e860 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65   || pPager->noRe
1e870 61 64 6c 6f 63 6b 20 29 3b 0a 0a 20 20 69 66 28  adlock );..  if(
1e880 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1e890 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
1e8a0 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
1e8b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e8c0 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
1e8d0 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ts */.    Pgno n
1e8e0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1e8f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1e900 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e910 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20  file */..    rc 
1e920 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
1e930 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
1e940 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e950 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
1e960 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
1e970 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e980 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
1e990 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
1e9a0 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Wal, 0);.      i
1e9b0 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  sWal = 0;.    }e
1e9c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1e9d0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1e9e0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1e9f0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
1ea00 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  >zWal, SQLITE_AC
1ea10 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73  CESS_EXISTS, &is
1ea20 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Wal.      );.   
1ea30 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1ea40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ea50 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20    if( isWal ){. 
1ea60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ea70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
1ea80 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
1ea90 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
1eaa0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1eab0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
1eac0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
1ead0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1eae0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1eaf0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1eb00 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
1eb10 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1eb20 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
1eb30 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
1eb40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1eb50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1eb60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1eb70 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
1eb80 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
1eb90 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
1eba0 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
1ebb0 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
1ebc0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
1ebd0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
1ebe0 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
1ebf0 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
1ec00 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
1ec10 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
1ec20 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
1ec30 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
1ec40 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
1ec50 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
1ec60 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
1ec70 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
1ec80 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
1ec90 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1eca0 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
1ecb0 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
1ecc0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
1ecd0 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
1ece0 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
1ecf0 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
1ed00 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
1ed10 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
1ed20 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
1ed30 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
1ed40 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
1ed50 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
1ed60 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
1ed70 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
1ed80 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
1ed90 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
1eda0 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1edb0 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
1edc0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1edd0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
1ede0 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
1edf0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
1ee00 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
1ee10 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
1ee20 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
1ee30 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
1ee40 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
1ee50 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
1ee60 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
1ee70 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
1ee80 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
1ee90 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
1eea0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
1eeb0 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
1eec0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1eed0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
1eee0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
1eef0 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
1ef00 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
1ef10 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
1ef20 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
1ef30 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
1ef40 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
1ef50 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
1ef60 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
1ef70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1ef80 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
1ef90 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
1efa0 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
1efb0 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
1efc0 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
1efd0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
1efe0 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
1eff0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
1f000 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
1f010 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
1f020 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
1f030 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
1f040 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
1f050 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
1f060 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
1f070 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
1f080 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
1f090 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
1f0a0 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
1f0b0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
1f0c0 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
1f0d0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1f0e0 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
1f0f0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
1f100 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
1f110 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
1f120 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
1f130 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
1f140 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
1f150 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
1f160 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
1f170 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
1f180 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
1f190 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
1f1a0 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
1f1b0 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
1f1c0 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
1f1d0 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
1f1e0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1f1f0 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
1f200 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
1f210 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
1f220 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
1f230 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
1f240 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
1f250 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
1f260 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f270 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
1f280 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
1f290 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1f2a0 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
1f2b0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
1f2c0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
1f2d0 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
1f2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1f2f0 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
1f300 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
1f310 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
1f320 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f330 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
1f340 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
1f350 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
1f360 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
1f370 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
1f380 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
1f390 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
1f3a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f3b0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
1f3c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1f3d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1f3e0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
1f3f0 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
1f400 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
1f410 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
1f420 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
1f430 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
1f440 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
1f450 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
1f460 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
1f470 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
1f480 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
1f490 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
1f4a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1f4b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1f4c0 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61  * Set the databa
1f4d0 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20  se size back to 
1f4e0 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73  the value it was
1f4f0 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65   before the save
1f500 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e  point .  ** bein
1f510 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f  g reverted was o
1f520 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
1f530 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1f540 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76  Savepoint ? pSav
1f550 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20  epoint->nOrig : 
1f560 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1f570 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  ze;.  pPager->ch
1f580 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1f590 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1f5a0 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
1f5b0 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
1f5c0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1f5d0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
1f5e0 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
1f5f0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
1f600 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
1f610 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
1f620 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
1f630 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
1f640 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
1f650 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
1f660 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
1f670 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
1f680 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
1f690 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
1f6a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1f6b0 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
1f6c0 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
1f6d0 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
1f6e0 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
1f6f0 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
1f700 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
1f710 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
1f720 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1f730 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
1f740 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
1f750 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
1f760 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
1f770 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
1f780 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
1f790 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
1f7a0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
1f7b0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
1f7c0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1f7d0 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
1f7e0 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
1f7f0 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
1f800 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
1f810 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
1f820 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
1f830 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
1f840 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
1f850 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
1f860 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
1f870 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
1f880 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
1f890 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
1f8a0 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
1f8b0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
1f8c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
1f8d0 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
1f8e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1f8f0 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
1f900 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
1f910 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
1f920 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
1f930 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
1f940 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1f950 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
1f960 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
1f970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f980 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f990 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
1f9a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1f9b0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1f9c0 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
1f9d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
1f9e0 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
1f9f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
1fa00 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
1fa10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1fa20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1fa30 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
1fa40 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
1fa50 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
1fa60 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
1fa70 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
1fa80 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
1fa90 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1faa0 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
1fab0 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
1fac0 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
1fad0 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
1fae0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
1faf0 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
1fb00 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
1fb10 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
1fb20 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
1fb30 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
1fb40 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
1fb50 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1fb60 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
1fb70 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
1fb80 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
1fb90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1fba0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
1fbb0 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
1fbc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
1fbd0 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
1fbe0 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
1fbf0 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
1fc00 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
1fc10 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
1fc20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
1fc30 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
1fc40 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
1fc50 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
1fc60 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1fc70 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1fc80 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1fc90 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
1fca0 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
1fcb0 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
1fcc0 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
1fcd0 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
1fce0 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1fcf0 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
1fd00 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1fd10 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
1fd20 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
1fd30 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
1fd40 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1fd50 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1fd60 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1fd70 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
1fd80 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
1fd90 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
1fda0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
1fdb0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1fdc0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
1fdd0 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
1fde0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
1fdf0 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
1fe00 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
1fe10 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
1fe20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1fe30 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1fe40 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
1fe50 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
1fe60 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
1fe70 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1fe80 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
1fe90 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1fea0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
1feb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
1fec0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
1fed0 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
1fee0 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
1fef0 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
1ff00 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
1ff10 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
1ff20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
1ff30 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
1ff40 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
1ff50 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
1ff60 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
1ff70 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
1ff80 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
1ff90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
1ffa0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
1ffb0 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
1ffc0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1ffd0 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
1ffe0 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
1fff0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
20000 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
20010 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
20020 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20030 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20040 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
20050 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
20060 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
20070 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
20080 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
20090 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
200a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
200b0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
200c0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
200d0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
200e0 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
200f0 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
20100 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20110 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
20120 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
20130 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
20140 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
20150 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
20160 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
20170 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
20180 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
20190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
201a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
201b0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
201c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
201d0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
201e0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
201f0 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
20200 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
20210 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
20220 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
20230 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
20240 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
20250 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
20260 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
20270 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
20280 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
20290 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
202a0 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
202b0 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
202c0 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
202d0 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
202e0 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
202f0 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
20300 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
20310 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
20320 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
20330 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
20340 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
20350 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
20360 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
20370 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
20380 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
20390 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
203a0 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
203b0 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
203c0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
203d0 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
203e0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
203f0 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
20400 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
20410 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
20420 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
20430 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
20440 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
20450 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
20460 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
20470 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
20480 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
20490 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
204a0 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
204b0 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
204c0 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
204d0 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
204e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
204f0 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
20500 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
20510 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
20520 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
20530 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
20540 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
20550 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
20560 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
20570 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
20580 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
20590 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
205a0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
205b0 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
205c0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
205d0 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
205e0 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
205f0 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
20600 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
20610 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
20620 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
20630 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
20640 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
20650 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
20660 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20670 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
20680 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
20690 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
206a0 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
206b0 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
206c0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
206d0 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
206e0 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
206f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
20700 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
20710 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
20720 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
20730 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
20740 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
20750 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
20760 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
20770 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
20780 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
20790 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
207a0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
207b0 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
207c0 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
207d0 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
207e0 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
207f0 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20  t bFullFsync){. 
20800 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
20810 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
20820 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20830 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
20840 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
20850 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
20860 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
20870 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  0;.  pPager->syn
20880 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c  c_flags = (bFull
20890 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  Fsync?SQLITE_SYN
208a0 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
208b0 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 7d 0a 23 65  NC_NORMAL);.}.#e
208c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
208d0 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
208e0 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
208f0 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
20900 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
20910 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
20920 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
20930 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
20940 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
20950 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
20960 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
20970 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
20980 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
20990 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
209a0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
209b0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
209c0 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
209d0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
209e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
209f0 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
20a00 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
20a10 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
20a20 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
20a30 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
20a40 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
20a50 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
20a60 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
20a70 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
20a80 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
20a90 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
20aa0 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
20ab0 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
20ac0 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
20ad0 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
20ae0 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
20af0 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
20b00 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
20b10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
20b20 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
20b30 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
20b40 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
20b50 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
20b60 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
20b70 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
20b80 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20b90 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
20ba0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
20bb0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
20bc0 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
20bd0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
20be0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
20bf0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
20c00 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
20c10 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
20c20 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
20c30 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
20c40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c60 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
20c70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
20c80 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
20c90 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
20ca0 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
20cb0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
20cc0 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
20cd0 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
20ce0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
20cf0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
20d00 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
20d10 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
20d20 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
20d30 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
20d40 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
20d50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
20d60 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
20d70 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
20d80 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
20d90 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
20da0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
20db0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
20dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
20dd0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
20de0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
20df0 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
20e00 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
20e10 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
20e20 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
20e30 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
20e40 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
20e50 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
20e60 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
20e70 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
20e80 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
20e90 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
20ea0 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
20eb0 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
20ec0 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
20ed0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
20ee0 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
20ef0 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
20f00 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
20f10 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
20f20 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
20f30 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
20f40 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
20f50 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
20f60 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
20f70 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
20f80 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
20fa0 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
20fb0 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
20fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20ff0 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
21000 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
21010 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
21020 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
21030 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
21040 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
21050 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
21060 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
21070 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
21080 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
21090 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
210a0 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
210b0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
210c0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
210d0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
210e0 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
210f0 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
21100 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
21110 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
21120 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
21130 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
21140 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
21150 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
21160 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
21170 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20  tBusyhandler(.  
21180 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211a0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
211b0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
211c0 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
211d0 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
211e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
211f0 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
21200 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
21210 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21230 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
21240 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
21250 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65   */.){  .  pPage
21260 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
21270 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = xBusyHandler;.
21280 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
21290 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73  andlerArg = pBus
212a0 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a  yHandlerArg;.}..
212b0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
212c0 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
212d0 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  by the Pager obj
212e0 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67  ect. The new pag
212f0 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61  e size .** is pa
21300 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69  ssed in *pPageSi
21310 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
21320 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
21330 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
21340 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
21350 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a  is called, it.**
21360 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
21370 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
21380 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  is the error sta
21390 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  te error code (i
213a0 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53  .e. .** one of S
213b0 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
213c0 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53  ITE_CORRUPT or S
213d0 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
213e0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
213f0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
21400 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
21410 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
21420 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
21430 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
21440 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
21450 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
21460 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
21470 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
21480 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
21490 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
214a0 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
214b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
214c0 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
214d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
214e0 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
214f0 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
21500 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
21510 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
21520 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
21530 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
21540 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
21550 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
21560 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
21570 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
21580 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
21590 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
215a0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
215b0 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
215c0 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
215d0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
215e0 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
215f0 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
21600 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
21610 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
21620 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
21630 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
21640 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
21650 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
21660 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
21670 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
21680 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
21690 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
216a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
216b0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
216c0 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
216d0 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
216e0 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
216f0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
21700 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
21710 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
21720 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
21730 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
21740 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
21750 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
21760 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
21770 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
21780 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
21790 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
217a0 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
217b0 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
217c0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
217d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
217e0 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
217f0 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
21800 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
21810 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
21820 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21830 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
21840 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
21850 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
21860 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
21870 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
21880 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
21890 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
218a0 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
218b0 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
218c0 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
218d0 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
218e0 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
218f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
21900 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
21910 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
21920 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
21930 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
21940 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
21950 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
21960 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
21970 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
21980 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
21990 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
219a0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
219b0 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
219c0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
219d0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
219e0 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
219f0 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
21a00 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
21a10 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
21a20 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
21a30 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
21a40 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
21a50 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
21a60 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
21a70 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
21a80 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
21a90 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
21aa0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
21ab0 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
21ac0 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
21ad0 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
21ae0 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a  >pageSize .  ){.
21af0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 3b 20      char *pNew; 
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b10 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
21b20 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
21b30 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
21b40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
21b50 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
21b60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
21b70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
21b80 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
21b90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
21ba0 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
21bb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21bc0 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
21bd0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
21be0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
21bf0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
21c00 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
21c10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
21c20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
21c30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21c40 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
21c50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
21c60 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 42  ger->dbSize = nB
21c70 79 74 65 2f 70 61 67 65 53 69 7a 65 3b 0a 20 20  yte/pageSize;.  
21c80 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
21c90 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
21ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
21cb0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
21cc0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
21cd0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
21ce0 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
21cf0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
21d00 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
21d10 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
21d20 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ize);.    }.  }.
21d30 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20  .  *pPageSize = 
21d40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21d50 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
21d60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
21d70 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52   nReserve<0 ) nR
21d80 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d  eserve = pPager-
21d90 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61  >nReserve;.    a
21da0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
21db0 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31  =0 && nReserve<1
21dc0 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  000 );.    pPage
21dd0 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69  r->nReserve = (i
21de0 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  16)nReserve;.   
21df0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
21e00 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
21e10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21e20 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
21e30 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
21e40 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
21e50 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
21e60 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
21e70 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
21e80 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
21e90 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
21ea0 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
21eb0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
21ec0 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
21ed0 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
21ee0 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
21ef0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
21f00 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
21f10 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
21f20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
21f30 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
21f40 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
21f50 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
21f60 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
21f70 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
21f80 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
21f90 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
21fa0 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
21fb0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
21fc0 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
21fd0 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
21fe0 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
21ff0 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
22000 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
22010 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
22020 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
22030 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
22040 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
22050 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
22060 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
22070 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
22080 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
22090 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
220a0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
220b0 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
220c0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
220d0 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
220e0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
220f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22100 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
22110 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22120 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
22130 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
22140 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
22150 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
22160 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
22170 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te!=PAGER_OPEN &
22180 26 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  & pPager->mxPgno
22190 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
221a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
221b0 78 50 67 6e 6f 20 3d 20 70 50 61 67 65 72 2d 3e  xPgno = pPager->
221c0 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65  dbSize;.  }.  re
221d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
221e0 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
221f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
22200 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
22210 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
22220 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
22230 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
22240 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
22250 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
22260 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
22270 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
22280 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
22290 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
222a0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
222b0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
222c0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
222d0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
222e0 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
222f0 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
22300 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
22310 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
22320 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
22330 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
22340 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
22350 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
22360 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
22370 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
22380 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
22390 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
223a0 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
223b0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
223c0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
223d0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
223e0 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
223f0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
22400 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
22410 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
22420 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
22430 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
22440 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
22450 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
22460 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
22470 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
22480 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
22490 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
224a0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
224b0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
224c0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
224d0 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
224e0 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
224f0 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
22500 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
22510 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
22520 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
22530 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
22540 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
22550 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
22560 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
22570 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
22580 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
22590 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
225a0 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
225b0 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
225c0 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
225d0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
225e0 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
225f0 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
22600 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
22610 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
22620 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
22630 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
22640 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
22650 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
22660 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
22670 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
22680 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
22690 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
226a0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
226b0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
226c0 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
226d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
226e0 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
226f0 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
22700 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22710 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
22720 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
22730 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
22740 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
22750 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22760 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
22770 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
22780 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
22790 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
227a0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
227b0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
227c0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
227d0 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
227e0 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
227f0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
22800 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
22810 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
22820 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
22830 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
22840 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
22850 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
22860 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
22870 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
22880 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
22890 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
228a0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
228b0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
228c0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
228d0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
228e0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
228f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
22900 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
22910 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
22920 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22930 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22940 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22950 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
22960 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
22970 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
22980 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
22990 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
229a0 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
229b0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
229c0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
229d0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
229e0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
229f0 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
22a00 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
22a10 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
22a20 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
22a30 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
22a40 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
22a50 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
22a60 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
22a70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
22a80 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
22a90 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
22aa0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
22ab0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22ac0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
22ad0 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
22ae0 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
22af0 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
22b00 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
22b10 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
22b20 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
22b30 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
22b40 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
22b50 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
22b60 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
22b70 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
22b80 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
22b90 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
22ba0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
22bb0 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
22bc0 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
22bd0 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
22be0 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
22bf0 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
22c00 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
22c10 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
22c20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
22c30 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
22c40 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
22c50 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
22c60 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
22c70 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
22c80 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
22c90 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
22ca0 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
22cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
22cc0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
22cd0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
22ce0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
22cf0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
22d00 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
22d10 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
22d20 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
22d30 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
22d40 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
22d50 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
22d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22d70 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
22d80 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
22d90 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
22da0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
22db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
22dd0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
22de0 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
22df0 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
22e00 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
22e10 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
22e20 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
22e30 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
22e40 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
22e50 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
22e60 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
22e70 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
22e80 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
22e90 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
22ea0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
22eb0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
22ec0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
22ed0 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
22ee0 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
22ef0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
22f00 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
22f10 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
22f20 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
22f30 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
22f40 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
22f50 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
22f60 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
22f70 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
22f80 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
22f90 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
22fa0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
22fb0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
22fc0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
22fd0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
22fe0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
22ff0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23000 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
23010 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
23020 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
23030 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
23040 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
23050 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
23060 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
23070 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
23080 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
23090 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
230a0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
230b0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
230c0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
230d0 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
230e0 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
230f0 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
23100 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
23110 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
23120 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
23130 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
23140 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
23150 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
23160 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
23170 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
23180 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
23190 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
231a0 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
231b0 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
231c0 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
231d0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
231e0 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
231f0 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
23200 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
23210 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
23220 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
23230 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
23240 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
23250 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
23260 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
23270 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
23280 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
23290 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
232a0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
232b0 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
232c0 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
232d0 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
232e0 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
232f0 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
23300 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77  rect behaviour w
23310 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
23320 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
23330 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
23340 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
23350 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
23360 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
23370 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
23380 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23390 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
233a0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
233b0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
233c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
233d0 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
233e0 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
233f0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
23400 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
23410 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
23420 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
23430 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
23440 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
23450 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
23460 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
23470 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
23480 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
23490 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
234a0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
234b0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
234c0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
234d0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
234e0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
234f0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
23500 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
23510 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
23520 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
23530 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
23540 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
23550 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
23560 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
23570 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
23580 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
23590 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
235a0 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
235b0 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
235c0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
235d0 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
235e0 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
235f0 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
23600 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
23610 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
23620 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
23630 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
23640 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
23650 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23660 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
23670 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
23680 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
23690 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
236a0 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
236b0 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
236c0 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
236d0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
236e0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
236f0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
23700 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
23710 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
23720 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
23730 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
23740 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
23750 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
23760 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
23770 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
23780 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
23790 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
237a0 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63  e;.  assertTrunc
237b0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
237c0 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ager);.}.../*.**
237d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
237e0 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
237f0 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
23800 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
23810 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
23820 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
23830 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
23840 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
23850 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
23860 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
23870 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
23880 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
23890 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
238a0 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
238b0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
238c0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
238d0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
238e0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
238f0 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
23900 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
23910 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
23920 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
23930 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
23940 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
23950 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
23960 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
23970 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
23980 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
23990 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
239a0 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
239b0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
239c0 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
239d0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
239e0 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
239f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
23a00 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
23a10 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
23a20 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
23a30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
23a40 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
23a50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
23a60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23a70 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
23a80 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
23a90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
23aa0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
23ab0 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
23ac0 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
23ad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23ae0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
23af0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
23b00 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
23b10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
23b20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
23b40 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
23b50 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
23b60 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
23b70 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
23b80 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
23b90 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
23ba0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
23bb0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
23bc0 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
23bd0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
23be0 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
23bf0 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
23c00 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
23c10 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
23c20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
23c30 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
23c40 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
23c50 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
23c60 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
23c70 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
23c80 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
23c90 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
23ca0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
23cb0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
23cc0 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
23cd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
23ce0 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
23cf0 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
23d00 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
23d10 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
23d20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
23d30 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
23d40 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
23d50 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
23d60 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
23d70 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
23d80 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
23d90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23da0 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
23db0 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54  Pager){.  u8 *pT
23dc0 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  mp = (u8 *)pPage
23dd0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20  r->pTmpSpace;.. 
23de0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
23df0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
23e00 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
23e10 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
23e20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  /* pPager->errCo
23e30 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  de = 0; */.  pPa
23e40 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
23e50 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  de = 0;.#ifndef 
23e60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
23e70 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73    sqlite3WalClos
23e80 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 0a  e(pPager->pWal,.
23e90 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53      (pPager->noS
23ea0 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65 72  ync ? 0 : pPager
23eb0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20 0a  ->sync_flags), .
23ec0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
23ed0 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20 29 3b 0a  Size, pTmp.  );.
23ee0 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d    pPager->pWal =
23ef0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67   0;.#endif.  pag
23f00 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
23f10 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
23f20 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
23f30 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  k(pPager);.  }el
23f40 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  se{.    /* If it
23f50 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74   is open, sync t
23f60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
23f70 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55  before calling U
23f80 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
23f90 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
23fa0 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68   is not done, th
23fb0 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70  en an unsynced p
23fc0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ortion of the op
23fd0 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  en journal .    
23fe0 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70  ** file may be p
23ff0 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
24000 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
24010 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
24020 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20   occurs .    ** 
24030 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61  while this is ha
24040 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74  ppening, the dat
24050 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f  abase could beco
24060 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  me corrupt..    
24070 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20  **.    ** If an 
24080 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
24090 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e  le trying to syn
240a0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  c the journal, s
240b0 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20  hift the pager. 
240c0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45     ** into the E
240d0 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73  RROR state. This
240e0 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e   causes UnlockAn
240f0 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c  dRollback to unl
24100 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ock the.    ** d
24110 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73  atabase and clos
24120 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
24130 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  le without attem
24140 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
24150 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20  .    ** back or 
24160 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65  finalize it. The
24170 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75   next database u
24180 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f  ser will have to
24190 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a   do hot-journal.
241a0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
241b0 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67  before accessing
241c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
241d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
241e0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
241f0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
24200 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
24210 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74  er, pagerSyncHot
24220 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29  Journal(pPager))
24230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
24240 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
24250 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
24260 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
24270 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
24280 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24290 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
242a0 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
242b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
242c0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
242d0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
242e0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
242f0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
24300 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71  ager->jfd);.  sq
24310 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
24320 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
24330 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
24340 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
24350 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
24360 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
24370 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
24380 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
24390 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
243a0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
243b0 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
243c0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
243d0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
243e0 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
243f0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
24400 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
24410 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
24420 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
24430 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
24440 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
24450 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
24460 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
24470 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
24480 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
24490 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
244a0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
244b0 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
244c0 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
244d0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
244e0 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
244f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
24500 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
24510 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
24520 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
24530 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
24540 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24550 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
24560 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
24570 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
24580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
24590 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
245a0 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
245b0 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
245c0 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
245d0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
245e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
245f0 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
24600 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
24610 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
24620 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
24630 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
24640 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
24650 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
24660 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  If the Pager.noS
24670 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ync flag is set,
24680 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
24690 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
246a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
246b0 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
246c0 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
246d0 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e   journal-mode an
246e0 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65  d the .** device
246f0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
24700 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
24710 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
24720 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
24730 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
24740 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
24750 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
24760 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
24770 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
24780 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
24790 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
247a0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
247b0 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
247c0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
247d0 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
247e0 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
247f0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
24800 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
24810 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
24820 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
24830 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
24840 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
24850 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
24860 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
24870 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
24880 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
24890 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
248a0 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
248b0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
248c0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
248d0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
248e0 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
248f0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
24900 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
24910 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
24920 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
24930 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
24940 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
24950 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
24960 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
24970 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
24980 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
24990 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
249a0 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
249b0 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
249c0 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
249d0 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
249e0 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
249f0 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
24a00 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
24a10 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
24a20 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
24a30 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
24a40 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
24a50 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
24a60 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
24a70 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f  lears the PGHDR_
24a80 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
24a90 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65  f every .** page
24aa0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
24ab0 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65  in memory before
24ac0 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
24ad0 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a  E_OK. If an IO.*
24ae0 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  * error is encou
24af0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65  ntered, then the
24b00 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
24b10 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
24b20 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
24b30 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
24b40 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
24b50 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a  r, int newHdr){.
24b60 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b80 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
24b90 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
24ba0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
24bb0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
24bc0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
24bd0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
24be0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
24bf0 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
24c00 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
24c10 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
24c20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
24c30 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
24c40 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
24c50 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
24c60 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
24c70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24c80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
24c90 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
24ca0 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
24cb0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
24cc0 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
24cd0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
24ce0 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
24cf0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
24d00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
24d10 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f  MORY ){.      co
24d20 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71  nst int iDc = sq
24d30 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
24d40 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
24d50 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
24d60 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
24d70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
24d80 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
24d90 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
24da0 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
24db0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
24dc0 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
24dd0 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
24de0 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
24df0 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
24e00 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
24e10 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
24e20 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
24e30 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
24e40 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
24e50 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
24e60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
24e70 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
24e80 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
24e90 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
24ea0 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
24eb0 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
24ec0 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
24ed0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
24ee0 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
24ef0 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
24f00 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
24f10 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
24f20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
24f30 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
24f40 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  's transaction),
24f50 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20   and a crash or 
24f60 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20  power-failure . 
24f70 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73         ** occurs
24f80 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75   after nRec is u
24f90 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  pdated but befor
24fa0 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
24fb0 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20  n writes .      
24fc0 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c    ** anything el
24fd0 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  se to the journa
24fe0 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69  l file (or commi
24ff0 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74  ts/rolls back it
25000 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  s .        ** tr
25010 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e  ansaction), then
25020 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f   SQLite may beco
25030 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e  me confused when
25040 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20   doing the .    
25050 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
25060 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  al rollback foll
25070 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20  owing recovery. 
25080 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b  It may roll back
25090 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
250a0 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
250b0 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70  ons data, then p
250c0 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e  roceed to rollin
250d0 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a  g back the old,.
250e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f          ** out-o
250f0 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74  f-date data that
25100 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74   follows it. Dat
25110 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
25120 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
25130 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20       ** To work 
25140 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
25150 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25160 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20   does appear to 
25170 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20  contain.        
25180 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65  ** a valid heade
25190 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65  r following Page
251a0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68  r.journalOff, th
251b0 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a  en write a 0x00.
251c0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20          ** byte 
251d0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
251e0 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  it to prevent it
251f0 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f   from being reco
25200 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20  gnized..        
25210 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61  **.        ** Va
25220 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f  riable iNextHdrO
25230 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20  ffset is set to 
25240 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68  the offset at wh
25250 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20  ich this.       
25260 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20   ** problematic 
25270 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75  header will occu
25280 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  r, if it exists.
25290 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20   aMagic is used 
252a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61  .        ** as a
252b0 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
252c0 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65  r to inspect the
252d0 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66   first couple of
252e0 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20   bytes of.      
252f0 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69    ** the potenti
25300 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  al journal heade
25310 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
25320 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48        i64 iNextH
25330 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  drOffset;.      
25340 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a    u8 aMagic[8];.
25350 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64          u8 zHead
25360 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
25370 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20  alMagic)+4];..  
25380 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65        memcpy(zHe
25390 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
253a0 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
253b0 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
253c0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26       put32bits(&
253d0 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
253e0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
253f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
25400 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
25410 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
25420 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
25430 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
25440 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
25450 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
25460 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
25470 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
25480 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25490 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
254a0 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
254b0 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
254c0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
254d0 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
254e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
254f0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
25500 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
25510 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
25520 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
25530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
25540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25550 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
25560 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
25570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
25580 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
25590 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
255a0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
255b0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
255c0 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
255d0 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
255e0 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
255f0 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
25600 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
25610 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
25620 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
25630 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
25640 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
25650 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
25660 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
25670 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
25680 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
25690 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
256a0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
256b0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
256c0 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
256d0 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
256e0 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
256f0 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
25700 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
25710 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
25720 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
25730 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
25740 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
25750 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
25760 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
25770 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
25780 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
25790 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
257a0 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
257b0 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
257c0 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
257d0 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
257e0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
257f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25800 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
25810 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
25820 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
25830 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
25840 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
25850 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
25860 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
25870 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
25880 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
25890 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
258a0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
258b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
258c0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
258d0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
258e0 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
258f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25900 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
25910 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25920 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
25930 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
25940 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
25950 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
25960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25970 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
25980 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
25990 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
259a0 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
259b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20  er->journalHdr. 
259c0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
259d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
259e0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
259f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25a00 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
25a10 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
25a20 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
25a30 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
25a40 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
25a50 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
25a60 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
25a70 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
25a80 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
25a90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25aa0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
25ab0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
25ac0 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20  nc_flags| .     
25ad0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
25ae0 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  nc_flags==SQLITE
25af0 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
25b00 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
25b10 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
25b20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
25b30 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
25b40 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
25b50 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
25b60 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
25b70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
25b80 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26     if( newHdr &&
25b90 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
25ba0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
25bb0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  D) ){.        pP
25bc0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
25bd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
25be0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
25bf0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
25c00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25c10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
25c20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
25c30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
25c40 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
25c50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
25c60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
25c70 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
25c80 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64  is in noSync mod
25c90 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
25ca0 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20  ile was just .  
25cb0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
25cc0 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77  synced. Either w
25cd0 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ay, clear the PG
25ce0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
25cf0 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20  ag on .  ** all 
25d00 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  pages..  */.  sq
25d10 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
25d20 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
25d30 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50  ->pPCache);.  pP
25d40 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
25d50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
25d60 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  D;.  assert( ass
25d70 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
25d80 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
25d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25da0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
25db0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
25dc0 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
25dd0 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
25de0 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
25df0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
25e00 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
25e10 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
25e20 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
25e30 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
25e40 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
25e50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
25e60 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
25e70 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
25e80 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
25e90 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
25ea0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
25eb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
25ec0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
25ed0 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
25ee0 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
25ef0 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
25f00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
25f10 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
25f20 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
25f30 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
25f40 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
25f50 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
25f60 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
25f70 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
25f80 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
25f90 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
25fa0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
25fb0 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
25fc0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
25fd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25fe0 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
25ff0 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
26000 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
26010 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
26020 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
26030 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
26040 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
26050 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
26060 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
26070 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
26080 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
26090 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
260a0 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
260b0 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
260c0 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
260d0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
260e0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
260f0 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
26100 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
26110 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
26120 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
26130 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
26140 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
26150 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
26160 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
26170 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
26180 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
26190 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
261a0 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
261b0 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
261c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
261d0 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
261e0 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
261f0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
26200 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
26210 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
26220 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
26230 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
26240 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
26250 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
26260 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
26270 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
26280 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
26290 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
262a0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
262b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
262c0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
262d0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
262e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
262f0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
26300 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
26310 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
26320 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
26330 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
26340 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
26350 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
26360 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
26370 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
26380 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
26390 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50  gelist(Pager *pP
263a0 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69  ager, PgHdr *pLi
263b0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
263c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
263d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
263e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
263f0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
26400 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
26410 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61   for rollback pa
26420 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44  gers in WRITER_D
26430 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  BMOD state. */. 
26440 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
26450 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
26460 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26470 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
26480 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b  _WRITER_DBMOD );
26490 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
264a0 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
264b0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
264c0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
264d0 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73   a temp-file has
264e0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
264f0 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
26500 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f  w. It.  ** is no
26510 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  t possible for r
26520 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68  c to be other th
26530 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
26540 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
26550 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61   is taken, as pa
26560 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
26570 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
26580 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20  r temp-files..  
26590 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
265a0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
265b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
265c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
265d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
265e0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
265f0 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
26600 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
26610 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
26620 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
26630 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c  the first write,
26640 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20   give the VFS a 
26650 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65  hint of what the
26660 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65   final.  ** file
26670 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20   size will be.. 
26680 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
26690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
266a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
266b0 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ) );.  if( rc==S
266c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
266d0 65 72 2d 3e 64 62 53 69 7a 65 3e 70 50 61 67 65  er->dbSize>pPage
266e0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 7b  r->dbHintSize ){
266f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
26700 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67  64 szFile = pPag
26710 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28  er->pageSize * (
26720 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50  sqlite3_int64)pP
26730 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
26740 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
26750 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
26760 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
26770 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69  SIZE_HINT, &szFi
26780 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  le);.    pPager-
26790 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
267a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
267b0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
267c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
267d0 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
267e0 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
267f0 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
26800 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
26810 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
26820 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
26830 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
26840 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
26850 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
26860 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
26870 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
26880 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
26890 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
268a0 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
268b0 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
268c0 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
268d0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
268e0 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
268f0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
26900 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
26910 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
26920 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
26930 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
26940 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
26950 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
26960 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
26970 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
26980 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
26990 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
269a0 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
269b0 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
269c0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
269d0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
269e0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
269f0 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
26a00 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
26a10 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
26a20 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
26a50 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
26a60 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
26a70 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
26a80 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
26a90 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  0 );..      /* E
26aa0 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ncode the databa
26ab0 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45  se */.      CODE
26ac0 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
26ad0 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
26ae0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
26af0 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a  NOMEM, pData);..
26b00 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
26b10 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
26b20 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
26b30 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
26b40 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
26b50 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
26b60 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
26b70 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
26b80 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
26b90 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
26ba0 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
26bb0 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
26bc0 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
26bd0 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
26be0 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
26bf0 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
26c00 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
26c10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26c20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
26c30 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
26c40 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
26c50 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
26c60 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
26c70 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
26c80 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
26c90 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
26ca0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
26cb0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
26cc0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
26cd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
26ce0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
26cf0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
26d00 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
26d10 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
26d20 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
26d30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
26d40 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
26d50 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
26d60 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
26d70 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
26d80 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
26d90 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
26da0 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
26db0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
26dc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
26dd0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
26de0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
26df0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
26e00 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
26e10 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
26e20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
26e30 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
26e40 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
26e50 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
26e60 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
26e70 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
26e80 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Write);.    }els
26e90 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
26ea0 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
26eb0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
26ec0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
26ed0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  no));.    }.#ifd
26ee0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
26ef0 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
26f00 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
26f10 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
26f20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
26f30 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
26f40 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
26f50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26f60 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
26f70 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
26f80 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20   is open. If it 
26f90 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
26fa0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
26fb0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
26fc0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
26fd0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
26fe0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
26ff0 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
27000 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   An .** SQLITE_I
27010 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
27020 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
27030 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  if a call to sql
27040 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a  ite3OsOpen() .**
27050 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
27060 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
27070 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
27080 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
27090 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
270a0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
270b0 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  >sjfd) ){.    if
270c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
270d0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
270e0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
270f0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
27100 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
27110 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
27120 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
27130 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
27140 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
27150 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
27160 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
27170 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
27180 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
27190 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
271a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
271b0 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
271c0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
271d0 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
271e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
271f0 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  * It is the call
27200 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
27210 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65  ty to use subjRe
27220 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
27230 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69  check .** that i
27240 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
27250 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ired before call
27260 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
27270 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
27280 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
27290 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
272a0 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
272b0 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
272c0 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
272d0 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
272e0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
272f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
27300 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
27310 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
27320 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
27330 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
27340 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
27350 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
27360 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
27370 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
27380 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
27390 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
273a0 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
273b0 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
273c0 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
273d0 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
273e0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
273f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
27400 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
27410 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
27420 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61  Pager;.  if( pPa
27430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
27440 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
27450 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20  ODE_OFF ){..    
27460 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
27470 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68  journal, if it h
27480 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
27490 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  een opened */.  
274a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
274b0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
274c0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
274d0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
274e0 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
274f0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73  Pager) );.    as
27500 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
27510 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50  ger->sjfd) || pP
27520 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30  ager->nSubRec==0
27530 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27540 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
27550 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  er) .         ||
27560 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
27570 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
27580 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
27590 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
275a0 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
275b0 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
275c0 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
275d0 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
275e0 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
275f0 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
27600 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
27610 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
27620 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
27630 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
27640 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
27650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27660 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
27670 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
27680 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
27690 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a  pPager->nSubRec*
276a0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
276b0 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ize);.      char
276c0 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20   *pData2;.  .   
276d0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
276e0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
276f0 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
27700 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
27710 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  a2);.      PAGER
27720 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
27730 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
27740 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
27750 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
27760 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
27770 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
27780 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
27790 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
277a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
277b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
277c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
277d0 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
277e0 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
277f0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
27800 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
27810 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
27820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27830 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
27840 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
27850 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
27860 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
27870 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
27880 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
27890 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
278a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
278b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
278c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
278d0 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
278e0 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
278f0 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
27900 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
27910 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
27920 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
27930 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
27940 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
27950 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
27960 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
27970 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
27980 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
27990 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
279a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
279b0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
279c0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
279d0 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
279e0 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
279f0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
27a00 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
27a10 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
27a20 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
27a30 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
27a40 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
27a50 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
27a60 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
27a70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27a80 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
27a90 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
27aa0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
27ab0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
27ac0 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
27ad0 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
27ae0 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
27af0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
27b00 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
27b10 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
27b20 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
27b30 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
27b40 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
27b50 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
27b60 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
27b70 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
27b80 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
27b90 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
27ba0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
27bb0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
27bc0 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
27bd0 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
27be0 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
27bf0 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
27c00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
27c10 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
27c20 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
27c30 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
27c40 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
27c50 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
27c60 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
27c70 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
27c80 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
27c90 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
27ca0 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
27cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
27cc0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
27cd0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
27ce0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
27cf0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
27d00 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
27d10 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20  tSyncSpill flag 
27d20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69  is set during ti
27d30 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61  mes when doing a
27d40 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f   sync of.  ** jo
27d50 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e  urnal (and addin
27d60 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20  g a new header) 
27d70 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20  is not allowed. 
27d80 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a   This occurs.  *
27d90 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74  * during calls t
27da0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
27db0 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69  ite() while tryi
27dc0 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75  ng to journal mu
27dd0 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65  ltiple.  ** page
27de0 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
27df0 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a  he same sector..
27e00 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f    **.  ** The do
27e10 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e  NotSpill flag in
27e20 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65  hibits all cache
27e30 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64   spilling regard
27e40 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a  less of whether.
27e50 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79    ** or not a sy
27e60 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
27e70 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72   This is set dur
27e80 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
27e90 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
27ea0 6e 67 20 69 73 20 61 6c 73 6f 20 69 6e 68 69 62  ng is also inhib
27eb0 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20  ited when in an 
27ec0 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 20 20 2a  error state..  *
27ed0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
27ee0 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
27ef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
27f00 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
27f10 70 69 6c 6c 20 29 20 72 65 74 75 72 6e 20 53 51  pill ) return SQ
27f20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
27f30 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
27f40 53 70 69 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66  Spill && (pPg->f
27f50 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
27f60 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20  D_SYNC)!=0 ){.  
27f70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27f80 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e  OK;.  }..  pPg->
27f90 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66  pDirty = 0;.  if
27fa0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
27fb0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
27fc0 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66  Write a single f
27fd0 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61  rame for this pa
27fe0 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a  ge to the log. *
27ff0 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
28000 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
28010 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ){ .      rc = s
28020 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
28030 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69  g); .    }.    i
28040 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28050 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
28060 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
28070 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 2c  ager, pPg, 0, 0,
28080 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
28090 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79  se{.  .    /* Sy
280a0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
280b0 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
280c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d   */.    if( pPg-
280d0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
280e0 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20  D_SYNC .     || 
280f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
28100 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
28110 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20  HEMOD.    ){.   
28120 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
28130 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  nal(pPager, 1);.
28140 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
28150 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
28160 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  er of this page 
28170 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
28180 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
28190 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  of.    ** the da
281a0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74  tabase image, it
281b0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
281c0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
281d0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ub-journal..    
281e0 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
281f0 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70  se the call to p
28200 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
28210 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c  ist() below will
28220 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75   not.    ** actu
28230 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20  ally write data 
28240 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  to the file in t
28250 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a  his case..    **
28260 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72  .    ** Consider
28270 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
28280 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74  equence of event
28290 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
282a0 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a     BEGIN;.    **
282b0 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
282c0 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
282d0 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e   <modify page X>
282e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45  .    **     SAVE
282f0 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a  POINT sp;.    **
28300 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64         <shrink d
28310 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
28320 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20  Y pages>.    ** 
28330 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73        pagerStres
28340 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a  s(page X).    **
28350 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
28360 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20   sp;.    **.    
28370 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
28380 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
28390 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
283a0 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
283b0 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f  written.    ** o
283c0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
283d0 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c  se file, but wil
283e0 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  l be dropped fro
283f0 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65  m the cache. The
28400 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  n,.    ** follow
28410 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  ing the "ROLLBAC
28420 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65  K TO sp" stateme
28430 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65  nt, reading page
28440 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20   X will read.   
28450 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
28460 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28470 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
28480 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58  e copy of page X
28490 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61   as it.    ** wa
284a0 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  s when the trans
284b0 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
284c0 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68  not as it was wh
284d0 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70  en "SAVEPOINT sp
284e0 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65  ".    ** was exe
284f0 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  cuted..    **.  
28500 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
28510 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68  n is to write th
28520 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66  e current data f
28530 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74  or page X into t
28540 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a  he .    ** sub-j
28550 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
28560 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
28570 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
28580 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
28590 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64    ** be restored
285a0 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20   to its current 
285b0 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22  value when the "
285c0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
285d0 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75  is .    ** execu
285e0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
285f0 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20  if( NEVER(.     
28600 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
28610 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   && pPg->pgno>pP
28620 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
28630 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
28640 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20  (pPg).    ) ){. 
28650 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
28660 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
28670 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
28680 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
28690 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
286a0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
286b0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
286c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
286d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
286e0 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
286f0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
28700 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
28710 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
28720 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67  list(pPager, pPg
28730 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
28740 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
28750 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
28760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28770 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
28780 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
28790 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
287a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
287b0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
287c0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
287d0 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
287e0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
287f0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
28800 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ; .}.../*.** All
28810 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
28820 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
28830 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
28840 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
28850 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
28860 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
28870 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
28880 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
28890 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
288a0 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
288b0 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
288c0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
288d0 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
288e0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
288f0 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
28900 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
28910 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
28920 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
28930 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
28940 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
28950 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
28960 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
28970 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
28980 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
28990 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
289a0 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
289b0 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
289c0 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
289d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
289e0 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
289f0 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
28a00 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
28a10 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
28a20 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
28a30 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
28a40 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
28a50 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
28a60 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
28a70 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
28a80 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
28a90 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
28aa0 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
28ab0 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
28ac0 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
28ad0 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
28ae0 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
28af0 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
28b00 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
28b10 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
28b20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
28b30 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
28b40 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
28b50 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
28b60 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
28b70 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
28b80 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
28b90 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d   of the PAGER_OM
28ba0 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50  IT_JOURNAL and P
28bb0 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
28bc0 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
28bd0 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
28be0 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
28bf0 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
28c00 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
28c10 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
28c20 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
28c30 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
28c40 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
28c50 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
28c60 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
28c70 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
28c80 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
28c90 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
28ca0 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
28cb0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
28cc0 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
28cd0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
28ce0 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
28cf0 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
28d00 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
28d10 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
28d20 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
28d30 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
28d40 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
28d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
28d60 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
28d70 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
28d80 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
28d90 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
28da0 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
28db0 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
28dc0 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
28dd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
28de0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
28df0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
28e00 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
28e10 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
28e20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
28e30 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
28e40 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
28e50 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
28e60 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
28e70 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
28e80 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
28e90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28ea0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
28eb0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
28ec0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
28ed0 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
28ee0 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
28ef0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
28f00 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
28f10 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
28f20 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
28f30 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
28f40 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
28f50 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
28f60 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
28f70 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
28f80 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
28f90 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
28fa0 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
28fb0 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
28fc0 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
28fd0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
28fe0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
28ff0 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
29000 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
29010 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
29020 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
29030 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
29040 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
29050 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
29060 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
29070 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
29080 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
29090 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
290a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
290b0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
290c0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
290d0 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
290e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
290f0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
29100 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
29110 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
29120 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
29130 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
29140 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
29150 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
29160 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
29170 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
29180 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
29190 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
291a0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
291b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
291c0 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
291d0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
291e0 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
291f0 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
29200 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
29210 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
29220 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61  l */.  int noRea
29230 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
29240 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
29250 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65  CK)!=0;  /* True
29260 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f   to omit read-lo
29270 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  ck */.  int pcac
29280 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
29290 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
292a0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
292b0 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
292c0 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50  che */.  u32 szP
292d0 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
292e0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
292f0 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
29300 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  page size */..  
29310 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
29320 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
29330 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
29340 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
29350 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
29360 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
29370 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
29380 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
29390 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
293a0 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
293b0 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
293c0 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
293d0 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
293e0 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
293f0 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
29400 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
29410 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
29420 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
29430 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
29440 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
29450 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
29460 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
29470 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
29480 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
29490 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
294a0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
294b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
294c0 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
294d0 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
294e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
294f0 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
29500 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
29510 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
29520 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
29530 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
29540 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
29550 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
29560 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
29570 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
29580 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
29590 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
295a0 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
295b0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
295c0 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
295d0 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
295e0 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20  *ppPager = 0;.. 
295f0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
29600 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
29610 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
29620 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
29630 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
29640 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
29650 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
29660 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
29670 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
29680 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
29690 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
296a0 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
296b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
296c0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
296d0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50  ame[0] ){.    nP
296e0 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
296f0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
29700 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
29710 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
29720 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
29730 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
29740 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
29750 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
29760 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
29770 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
29780 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
29790 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
297a0 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
297b0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
297c0 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
297d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
297e0 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
297f0 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
29800 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
29810 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
29820 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
29830 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
29840 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29850 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
29860 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
29870 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
29880 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
29890 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
298a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
298b0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
298c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
298d0 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
298e0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
298f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
29900 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
29910 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
29920 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
29930 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
29940 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
29950 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
29960 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
29970 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
29980 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
29990 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
299a0 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
299b0 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
299c0 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
299d0 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
299e0 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
299f0 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
29a00 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
29a10 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
29a20 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
29a30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
29a40 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
29a50 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
29a60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
29a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29a80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
29a90 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
29aa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
29ab0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
29ac0 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
29ad0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
29ae0 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
29af0 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
29b00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
29b10 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
29b20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
29b30 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
29b40 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
29b50 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
29b60 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
29b70 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
29b80 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
29ba0 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
29bb0 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
29bc0 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
29bd0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
29be0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
29bf0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
29c00 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
29c10 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
29c20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
29c30 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
29c40 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
29c50 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
29c60 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
29c70 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
29c80 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
29c90 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
29ca0 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
29cb0 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
29cc0 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
29cd0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
29ce0 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
29cf0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
29d00 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
29d10 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
29d20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
29d30 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
29d40 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
29d50 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
29d60 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
29d70 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
29d80 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
29d90 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
29da0 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
29db0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
29dc0 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
29dd0 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
29de0 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
29df0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
29e00 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
29e10 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
29e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29e30 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
29e40 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
29e50 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20  name + 1 +      
29e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
29e70 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
29e80 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20  athname + 8 + 1 
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29ea0 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e  zJournal */.#ifn
29eb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29ec0 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e  WAL.    + nPathn
29ed0 61 6d 65 20 2b 20 34 20 2b 20 31 20 20 20 20 20  ame + 4 + 1     
29ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c           /* zWal
29ef0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   */.#endif.  );.
29f00 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
29f10 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
29f20 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
29f30 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
29f40 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
29f50 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
29f60 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
29f70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
29f80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
29f90 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
29fa0 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
29fb0 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
29fc0 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
29fd0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
29fe0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
29ff0 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
2a000 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
2a010 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2a020 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
2a030 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
2a040 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
2a050 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2a060 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2a070 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
2a080 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
2a090 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2a0a0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2a0b0 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
2a0c0 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
2a0d0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
2a0e0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2a0f0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2a100 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
2a110 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
2a120 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2a130 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
2a140 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
2a150 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
2a160 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
2a170 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
2a180 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
2a190 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
2a1a0 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
2a1b0 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d  me + 1);.    mem
2a1c0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
2a1d0 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
2a1e0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2a1f0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2a200 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68  >zJournal, zPath
2a210 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2a220 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
2a230 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
2a240 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
2a250 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69  rnal", 8);.    i
2a260 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  f( pPager->zFile
2a270 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  name[0]==0 ){.  
2a280 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
2a290 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  rnal[0] = 0;.   
2a2a0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
2a2b0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 65  E_OMIT_WAL.    e
2a2c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
2a2d0 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2a2e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2a2f0 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2a300 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2a310 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  >zWal, zPathname
2a320 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2a330 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2a340 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61  er->zWal[nPathna
2a350 6d 65 5d 2c 20 22 2d 77 61 6c 22 2c 20 34 29 3b  me], "-wal", 4);
2a360 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2a370 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a380 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2a390 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2a3a0 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2a3b0 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2a3c0 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2a3d0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2a3e0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2a3f0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2a400 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
2a410 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
2a420 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2a430 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2a440 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2a450 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
2a460 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2a470 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2a480 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2a490 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
2a4a0 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61   &fout);.    rea
2a4b0 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
2a4c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2a4d0 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
2a4e0 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
2a4f0 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
2a500 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2a510 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
2a520 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
2a530 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
2a540 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
2a550 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
2a560 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2a570 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2a580 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
2a590 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
2a5a0 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
2a5b0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2a5c0 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
2a5d0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
2a5e0 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
2a5f0 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
2a600 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
2a610 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
2a620 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
2a630 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
2a640 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2a650 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
2a660 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
2a670 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2a680 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
2a690 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
2a6a0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
2a6b0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2a6c0 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
2a6d0 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
2a6e0 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
2a6f0 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
2a700 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
2a710 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
2a720 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2a730 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
2a740 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
2a750 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2a760 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
2a770 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a780 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2a790 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
2a7a0 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
2a7b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
2a7c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2a7d0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2a7e0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2a7f0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
2a800 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2a810 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2a820 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >fd);.        in
2a830 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73  t ii;.        as
2a840 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2a850 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
2a860 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
2a870 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2a880 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2a890 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2a8a0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2a8b0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2a8c0 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
2a8d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
2a8e0 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
2a8f0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2a900 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
2a910 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
2a920 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
2a930 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
2a940 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
2a950 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2a960 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
2a970 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2a980 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2a990 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2a9a0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
2a9b0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
2a9c0 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
2a9d0 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
2a9e0 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
2a9f0 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
2aa00 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
2aa10 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
2aa20 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
2aa30 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
2aa40 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
2aa50 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
2aa60 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
2aa70 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
2aa80 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
2aa90 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2aaa0 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
2aab0 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
2aac0 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
2aad0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
2aae0 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
2aaf0 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
2ab00 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
2ab10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
2ab20 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2ab30 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
2ab40 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2ab50 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2ab60 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20  GER_READER;.    
2ab70 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
2ab80 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
2ab90 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2aba0 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
2abb0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2abc0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
2abd0 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20  llowing call to 
2abe0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2abf0 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74  () serves to set
2ac00 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20   the value of . 
2ac10 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   ** Pager.pageSi
2ac20 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61  ze and to alloca
2ac30 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d  te the Pager.pTm
2ac40 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
2ac50 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2ac60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2ac70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
2ac80 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72  emDb==0 );.    r
2ac90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2aca0 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
2acb0 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c  er, &szPageDflt,
2acc0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
2acd0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
2ace0 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  K );.  }..  /* I
2acf0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2ad00 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
2ad10 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
2ad20 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a  e, free the .  *
2ad30 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
2ad40 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
2ad50 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2ad60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ad70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
2ad80 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
2ad90 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
2ada0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
2adb0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
2adc0 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
2add0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2ade0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
2adf0 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a  e the PCache obj
2ae00 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ect. */.  assert
2ae10 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b  ( nExtra<1000 );
2ae20 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e  .  nExtra = ROUN
2ae30 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71  D8(nExtra);.  sq
2ae40 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28  lite3PcacheOpen(
2ae50 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74  szPageDflt, nExt
2ae60 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20  ra, !memDb,.    
2ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae80 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65  !memDb?pagerStre
2ae90 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50  ss:0, (void *)pP
2aea0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50  ager, pPager->pP
2aeb0 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52  Cache);..  PAGER
2aec0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
2aed0 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
2aee0 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
2aef0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2af00 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
2af10 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
2af20 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2af30 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
2af40 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2af50 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
2af60 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nal;.  pPager->n
2af70 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52  oReadlock = (noR
2af80 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
2af90 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20  nly) ?1:0;.  /* 
2afa0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
2afb0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2afc0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
2afd0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2afe0 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
2aff0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2b000 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
2b010 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2b020 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
2b030 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
2b040 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
2b050 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
2b060 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
2b070 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
2b080 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
2b090 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a  NLOCK; */.#if 0.
2b0a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2b0b0 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70  ->state == (temp
2b0c0 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43  File ? PAGER_EXC
2b0d0 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55  LUSIVE : PAGER_U
2b0e0 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66  NLOCK) );.#endif
2b0f0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
2b100 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
2b110 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2b120 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2b130 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
2b140 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2b150 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
2b160 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
2b170 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2b180 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2b190 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
2b1a0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2b1b0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
2b1c0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
2b1d0 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
2b1e0 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
2b1f0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2b200 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
2b210 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
2b220 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
2b230 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
2b240 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
2b250 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74  adOnly;.  assert
2b260 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
2b270 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2b280 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
2b290 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
2b2a0 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2b2b0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50  r->fullSync = pP
2b2c0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a  ager->noSync ?0:
2b2d0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  1;.  pPager->syn
2b2e0 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  c_flags = SQLITE
2b2f0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2b300 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2b310 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
2b320 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
2b330 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
2b340 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
2b350 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2b360 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
2b370 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
2b380 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
2b390 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2b3a0 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
2b3b0 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
2b3c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2b3d0 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
2b3e0 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
2b3f0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
2b400 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
2b410 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2b420 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2b430 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2b440 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
2b450 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
2b460 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2b470 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2b480 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
2b490 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
2b4a0 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
2b4b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
2b4c0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
2b4d0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2b4e0 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
2b4f0 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
2b500 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
2b510 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
2b520 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20  ->aHash)); */.. 
2b530 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
2b540 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
2b550 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
2b560 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2b570 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
2b580 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
2b590 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rom PAGER_UNLOCK
2b5a0 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41   to.** PAGER_SHA
2b5b0 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65  RED state. It te
2b5c0 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20  sts if there is 
2b5d0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72  a hot journal pr
2b5e0 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
2b5f0 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
2b600 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
2b610 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
2b620 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e  s one that .** n
2b630 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
2b640 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e  d back. Accordin
2b650 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  g to this functi
2b660 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  on, a hot-journa
2b670 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73  l.** file exists
2b680 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
2b690 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  g criteria are m
2b6a0 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
2b6b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2b6c0 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
2b6d0 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
2b6e0 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
2b6f0 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2b700 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2b710 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2b720 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
2b730 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
2b740 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
2b750 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
2b760 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a  es in size, and.
2b770 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
2b780 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75   byte of the jou
2b790 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2b7a0 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30   and is not 0x00
2b7b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
2b7c0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
2b7d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b7e0 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
2b7f0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
2b800 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
2b810 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
2b820 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
2b830 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
2b840 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
2b850 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68  same name. In th
2b860 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
2b870 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a  nal file is.** j
2b880 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e  ust deleted usin
2b890 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78  g OsDelete, *pEx
2b8a0 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30  ists is set to 0
2b8b0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
2b8c0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
2b8d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2b8e0 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b  e does not check
2b8f0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d   if there is a m
2b900 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2b910 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65  lename.** at the
2b920 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
2b930 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61  . If there is, a
2b940 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a  nd that master j
2b950 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64  ournal file.** d
2b960 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
2b970 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2b980 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2b990 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a  ly hot. In this.
2b9a0 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ** case this rou
2b9b0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
2b9c0 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
2b9d0 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  e. The pager_pla
2b9e0 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  yback().** routi
2b9f0 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
2ba00 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2ba10 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2ba20 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a  ally hot and .**
2ba30 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69   will not roll i
2ba40 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  t back. .**.** I
2ba50 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
2ba60 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f  file is found to
2ba70 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73   exist, *pExists
2ba80 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64   is set to 1 and
2ba90 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72   .** SQLITE_OK r
2baa0 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68  eturned. If no h
2bab0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2bac0 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78  is present, *pEx
2bad0 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74  ists is.** set t
2bae0 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
2baf0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
2bb00 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2bb10 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  s while trying.*
2bb20 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  * to determine w
2bb30 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
2bb40 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2bb50 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20   exists, the IO 
2bb60 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
2bb70 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2bb80 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69  e value of *pExi
2bb90 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64  sts is undefined
2bba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bbb0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
2bbc0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2bbd0 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
2bbe0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
2bbf0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
2bc00 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20  >pVfs;.  int rc 
2bc10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2bc20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2bc30 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   code */.  int e
2bc40 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20  xists = 1;      
2bc50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2bc60 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   if a journal fi
2bc70 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  le is present */
2bc80 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20  .  int jrnlOpen 
2bc90 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65  = !!isOpen(pPage
2bca0 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65  r->jfd);..  asse
2bcb0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2bcc0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
2bcd0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2bce0 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
2bcf0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2bd00 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
2bd10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e  ;..  assert( jrn
2bd20 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71  lOpen==0 || ( sq
2bd30 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2bd40 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2bd50 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20  ger->jfd) &.    
2bd60 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
2bd70 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
2bd80 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78  EN.  ));..  *pEx
2bd90 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  ists = 0;.  if( 
2bda0 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2bdb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
2bdc0 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
2bdd0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
2bde0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2bdf0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
2be00 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2be10 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
2be20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
2be30 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
2be40 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
2be50 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
2be60 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2be70 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65   */..    /* Race
2be80 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a   condition here:
2be90 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73    Another proces
2bea0 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  s might have bee
2beb0 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  n holding the.  
2bec0 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45    ** the RESERVE
2bed0 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20  D lock and have 
2bee0 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61  a journal open a
2bef0 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41  t the sqlite3OsA
2bf00 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20  ccess() .    ** 
2bf10 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20  call above, but 
2bf20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
2bf30 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70  journal and drop
2bf40 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65   the lock before
2bf50 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74  .    ** we get t
2bf60 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2bf70 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
2bf80 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
2bf90 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20  l.  If that.    
2bfa0 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  ** is the case, 
2bfb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
2bfc0 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69  ht think there i
2bfd0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2bfe0 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66  when.    ** in f
2bff0 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e  act there is non
2c000 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  e.  This results
2c010 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69   in a false-posi
2c020 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a  tive which will.
2c030 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
2c040 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79  with by the play
2c050 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54  back routine.  T
2c060 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20  icket #3883..   
2c070 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2c080 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
2c090 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
2c0a0 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
2c0b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c0c0 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
2c0d0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  {.      Pgno nPa
2c0e0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2c0f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c100 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
2c110 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
2c120 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73    /* Check the s
2c130 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2c140 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20  ase file. If it 
2c150 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61  consists of 0 pa
2c160 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ges,.      ** th
2c170 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2c180 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20  urnal file. See 
2c190 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
2c1a0 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20  nt above for .  
2c1b0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f      ** the reaso
2c1c0 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65  ning here.  Dele
2c1d0 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20  te the obsolete 
2c1e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64  journal file und
2c1f0 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45  er.      ** a RE
2c200 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
2c210 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74  void race condit
2c220 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69  ions and to avoi
2c230 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20  d violating.    
2c240 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20    ** [H33020].. 
2c250 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2c260 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
2c270 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
2c280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2c290 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c2a0 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
2c2b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c2c0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
2c2d0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
2c2e0 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c        if( pagerL
2c2f0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45  ockDb(pPager, RE
2c300 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51  SERVED_LOCK)==SQ
2c310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
2c330 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
2c340 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
2c350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2c360 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
2c370 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
2c380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2c390 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c3a0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
2c3b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2c3c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2c3d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2c3e0 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74  exists and no ot
2c3f0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
2c400 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20  as a reserved.  
2c410 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72          ** or gr
2c420 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
2c430 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2c440 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
2c450 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
2c460 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
2c470 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65  ne non-zero byte
2c480 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
2c490 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2c4a0 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le..          **
2c4b0 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68   If there is, th
2c4c0 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74  en we consider t
2c4d0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  his journal to b
2c4e0 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a  e hot. If not, .
2c4f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
2c500 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  can be ignored..
2c510 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2c520 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
2c530 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
2c540 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
2c550 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2c560 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
2c570 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
2c580 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2c590 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2c5a0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2c5b0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
2c5c0 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20  , &f);.         
2c5d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2c5e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c5f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38  {.            u8
2c600 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20   first = 0;.    
2c610 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2c620 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
2c630 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29  r->jfd, (void *)
2c640 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20  &first, 1, 0);. 
2c650 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2c660 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
2c670 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
2c680 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2c690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c6a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c6b0 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
2c6c0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2c6d0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
2c6e0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
2c6f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c700 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
2c710 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30  ists = (first!=0
2c720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2c730 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2c740 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
2c750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2c760 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  we cannot open t
2c770 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
2c780 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  nal file in orde
2c790 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  r to see if.    
2c7a0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68          ** its h
2c7b0 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72  as a zero header
2c7c0 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
2c7d0 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72  due to an I/O er
2c7e0 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20  ror, or.        
2c7f0 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
2c800 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61  be due to the ra
2c810 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  ce condition des
2c820 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64  cribed above and
2c830 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
2c840 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e  ** ticket #3883.
2c850 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73    Either way, as
2c860 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f  sume that the jo
2c870 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20  urnal is hot..  
2c880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
2c890 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c  s might be a fal
2c8a0 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75  se positive.  Bu
2c8b0 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e  t if it is, then
2c8c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
2c8d0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f   ** automatic jo
2c8e0 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61  urnal playback a
2c8f0 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68  nd recovery mech
2c900 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a  anism will deal.
2c910 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
2c920 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20  ith it under an 
2c930 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77  EXCLUSIVE lock w
2c940 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  here we do not n
2c950 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
2c960 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d     ** worry so m
2c970 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f  uch with race co
2c980 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nditions..      
2c990 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c9a0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
2c9b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
2c9c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c9d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c9e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c9f0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
2ca00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2ca10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2ca20 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
2ca30 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
2ca40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ca50 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  le..** It is ill
2ca60 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
2ca70 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
2ca80 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  () until after t
2ca90 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
2caa0 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2cab0 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66  fully called. If
2cac0 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69   a shared-lock i
2cad0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77  s already held w
2cae0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  hen.** this func
2caf0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2cb00 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
2cb10 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2cb20 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  ng operations ar
2cb30 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64  e also performed
2cb40 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2cb50 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66  n..**.**   1) If
2cb60 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75   the pager is cu
2cb70 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52  rrently in PAGER
2cb80 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e  _UNLOCK state (n
2cb90 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20  o lock held.**  
2cba0 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
2cbb0 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20  ase file), then 
2cbc0 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
2cbd0 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a  de to obtain a.*
2cbe0 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f  *      SHARED lo
2cbf0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2cc00 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61  se file. Immedia
2cc10 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
2cc20 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ning.**      the
2cc30 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
2cc40 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73  e file-system is
2cc50 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68   checked for a h
2cc60 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20  ot-journal,.**  
2cc70 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61      which is pla
2cc80 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73  yed back if pres
2cc90 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61  ent. Following a
2cca0 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a  ny hot-journal .
2ccb0 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
2ccc0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
2ccd0 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20  f the cache are 
2cce0 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65  validated by che
2ccf0 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  cking.**      th
2cd00 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  e 'change-counte
2cd10 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  r' field of the 
2cd20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
2cd30 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ader and.**     
2cd40 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68   discarded if th
2cd50 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20  ey are found to 
2cd60 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  be invalid..**.*
2cd70 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61  *   2) If the pa
2cd80 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
2cd90 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
2cda0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
2cdb0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
2cdc0 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67    no outstanding
2cdd0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
2cde0 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73  ny pages, and is
2cdf0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2ce00 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65  ate,.**      the
2ce10 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
2ce20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68  made to clear th
2ce30 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79  e error state by
2ce40 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20   discarding.**  
2ce50 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73      the contents
2ce60 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63   of the page cac
2ce70 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62  he and rolling b
2ce80 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75  ack any open jou
2ce90 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c  rnal.**      fil
2cea0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2ceb0 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69  operation descri
2cec0 62 65 64 20 62 79 20 28 32 29 20 61 62 6f 76 65  bed by (2) above
2ced0 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
2cee0 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a  d, and if the.**
2cef0 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20   pager is in an 
2cf00 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
2cf10 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
2cf20 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  LL when this is 
2cf30 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65  called,.** the e
2cf40 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
2cf50 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2cf60 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74 74  d. It is permitt
2cf70 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a  ed to read the.*
2cf80 2a 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 20  * database when 
2cf90 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65  in SQLITE_FULL e
2cfa0 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
2cfb0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
2cfc0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2cfd0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
2cfe0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2cff0 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72   If an.** IO err
2d000 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2d010 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
2d020 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
2d030 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2d040 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c  .** file or roll
2d050 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
2d060 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20  al file, the IO 
2d070 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2d080 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
2d090 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
2d0a0 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
2d0b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2d0c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2d0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2d0e0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2d0f0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2d100 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
2d110 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f  rom b-tree and o
2d120 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61  nly when there a
2d130 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74  re no.  ** outst
2d140 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68  anding pages. Th
2d150 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  is implies that 
2d160 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  the pager state 
2d170 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20  should either.  
2d180 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45  ** be OPEN or RE
2d190 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20  ADER. READER is 
2d1a0 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
2d1b0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72   the pager is or
2d1c0 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78   was in .  ** ex
2d1d0 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
2d1e0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
2d1f0 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
2d200 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2d210 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
2d220 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
2d230 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
2d240 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
2d250 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
2d260 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
2d270 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2d280 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
2d290 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d  .  if( NEVER(MEM
2d2a0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  DB && pPager->er
2d2b0 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e  rCode) ){ return
2d2c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2d2d0 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65  ; }..  if( !page
2d2e0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2d2f0 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
2d300 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e==PAGER_OPEN ){
2d310 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75  .    int bHotJou
2d320 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  rnal = 1;       
2d330 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2d340 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74  ere exists a hot
2d350 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f   journal-file */
2d360 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ..    assert( !M
2d370 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
2d380 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  rt( pPager->noRe
2d390 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50 61  adlock==0 || pPa
2d3a0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  ger->readOnly );
2d3b0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
2d3c0 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20  ->noReadlock==0 
2d3d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2d3e0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
2d3f0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
2d400 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2d410 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d420 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2d430 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
2d440 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  =NO_LOCK || pPag
2d450 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
2d460 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
2d470 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2d480 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2d490 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
2d4a0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
2d4b0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
2d4c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
2d4d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2d4e0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
2d4f0 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
2d500 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2d510 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
2d520 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
2d530 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
2d540 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
2d550 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
2d560 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
2d570 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
2d580 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d5a0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
2d5b0 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
2d5c0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
2d5d0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
2d5e0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
2d5f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
2d600 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
2d610 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
2d620 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
2d630 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
2d640 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
2d650 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
2d660 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
2d670 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
2d680 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
2d690 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
2d6a0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
2d6b0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
2d6c0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2d6d0 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
2d6e0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
2d6f0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
2d700 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
2d710 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
2d720 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
2d730 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
2d740 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
2d750 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
2d760 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
2d770 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
2d780 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
2d790 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
2d7a0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
2d7b0 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
2d7c0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
2d7d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
2d7e0 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
2d7f0 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
2d800 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
2d810 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
2d820 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
2d830 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
2d840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d850 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
2d860 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
2d870 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
2d880 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
2d890 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
2d8a0 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
2d8b0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
2d8c0 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
2d8d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2d8e0 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
2d8f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2d900 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
2d910 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
2d920 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d930 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d940 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2d950 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
2d960 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
2d970 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
2d980 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
2d990 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
2d9a0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
2d9b0 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
2d9c0 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
2d9d0 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
2d9e0 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
2d9f0 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
2da00 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
2da10 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2da20 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
2da30 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
2da40 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
2da50 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
2da60 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
2da70 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
2da80 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
2da90 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
2daa0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
2dab0 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
2dac0 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
2dad0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
2dae0 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
2daf0 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
2db00 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
2db10 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
2db20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
2db30 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
2db40 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
2db50 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
2db60 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
2db70 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
2db80 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
2db90 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
2dba0 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
2dbb0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
2dbc0 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
2dbd0 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
2dbe0 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
2dbf0 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
2dc00 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
2dc10 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
2dc20 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
2dc30 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
2dc40 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
2dc50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
2dc60 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
2dc70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2dc80 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2dc90 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
2dca0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
2dcb0 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
2dcc0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
2dcd0 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
2dce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2dcf0 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
2dd00 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
2dd10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2dd20 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
2dd30 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
2dd40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2dd50 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2dd60 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
2dd70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2dd80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
2dd90 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
2dda0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
2ddb0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
2ddc0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2ddd0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2dde0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2ddf0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
2de00 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
2de10 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
2de20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2de30 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2de40 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
2de50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
2de60 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
2de70 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2de80 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2de90 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2dea0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2deb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2dec0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2ded0 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
2dee0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2def0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2df00 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2df10 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2df20 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2df30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2df40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
2df50 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
2df60 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
2df70 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
2df80 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
2df90 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
2dfa0 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
2dfb0 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
2dfc0 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
2dfd0 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
2dfe0 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
2dff0 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
2e000 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
2e010 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
2e020 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
2e030 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
2e040 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
2e050 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
2e060 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
2e070 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
2e080 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
2e090 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
2e0a0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
2e0b0 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
2e0c0 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
2e0d0 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
2e0e0 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
2e0f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
2e100 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
2e110 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
2e120 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
2e130 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2e140 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
2e150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2e160 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2e170 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
2e180 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2e190 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e1a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2e1b0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
2e1c0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
2e1d0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2e1e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2e1f0 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
2e200 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2e210 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
2e220 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
2e230 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
2e240 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
2e250 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
2e260 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2e270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e280 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2e290 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
2e2a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
2e2b0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
2e2c0 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
2e2d0 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
2e2e0 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
2e2f0 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
2e300 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
2e310 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
2e320 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
2e330 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2e340 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2e350 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
2e360 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
2e370 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
2e380 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
2e390 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
2e3a0 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
2e3b0 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
2e3c0 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
2e3d0 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
2e3e0 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
2e3f0 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
2e400 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
2e410 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
2e420 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e430 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
2e440 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
2e450 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
2e460 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
2e470 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
2e480 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
2e490 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
2e4a0 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
2e4b0 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
2e4c0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
2e4d0 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
2e4e0 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
2e4f0 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
2e500 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
2e510 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
2e520 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
2e530 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
2e540 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
2e550 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
2e560 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
2e570 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
2e580 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
2e590 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
2e5a0 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
2e5b0 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
2e5c0 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
2e5d0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
2e5e0 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
2e5f0 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
2e600 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
2e610 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
2e620 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
2e630 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
2e640 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2e650 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
2e660 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
2e670 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
2e680 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
2e690 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e6a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2e6b0 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
2e6c0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
2e6d0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
2e6e0 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
2e6f0 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
2e700 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
2e710 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
2e720 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
2e730 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
2e740 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e750 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
2e760 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71  r->pBackup || sq
2e770 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
2e780 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2e790 61 63 68 65 29 3e 30 29 20 0a 20 20 20 20 29 7b  ache)>0) .    ){
2e7a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
2e7b0 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
2e7c0 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
2e7d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2e7e0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
2e7f0 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
2e800 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
2e810 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
2e820 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a  previous.      *
2e830 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
2e840 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43  transaction).  C
2e850 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2e860 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
2e870 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
2e880 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
2e890 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
2e8a0 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
2e8b0 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
2e8c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2e8d0 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
2e8e0 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
2e8f0 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
2e900 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
2e910 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
2e920 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
2e930 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
2e940 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
2e950 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
2e960 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
2e970 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
2e980 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
2e990 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
2e9a0 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
2e9b0 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
2e9c0 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
2e9d0 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
2e9e0 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
2e9f0 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
2ea00 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
2ea10 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
2ea20 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
2ea30 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
2ea40 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
2ea50 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
2ea60 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
2ea70 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
2ea80 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
2ea90 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
2eaa0 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
2eab0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2eac0 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a  Pgno nPage = 0;.
2ead0 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
2eae0 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
2eaf0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2eb00 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ];..      rc = p
2eb10 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
2eb20 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
2eb30 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2eb40 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20  to failed;..    
2eb50 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
2eb60 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
2eb70 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
2eb80 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
2eb90 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
2eba0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2ebb0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
2ebc0 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
2ebd0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
2ebe0 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
2ebf0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2ec00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ec10 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2ec20 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
2ec30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ec40 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
2ec50 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
2ec60 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
2ec70 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
2ec80 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
2ec90 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
2eca0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
2ecb0 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
2ecc0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
2ecd0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
2ece0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2ecf0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2ed00 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68  a WAL file in th
2ed10 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f  e file-system, o
2ed20 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73  pen this databas
2ed30 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20  e in WAL.    ** 
2ed40 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  mode. Otherwise,
2ed50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
2ed60 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20  unction call is 
2ed70 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
2ed80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
2ed90 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70  enWalIfPresent(p
2eda0 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
2edb0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
2edc0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
2edd0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  E_OK );.  }..  i
2ede0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
2edf0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
2ee00 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2ee10 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
2ee20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
2ee30 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2ee40 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  );.  }..  if( pP
2ee50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2ee60 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d  GER_OPEN && rc==
2ee70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ee80 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
2ee90 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50  ount(pPager, &pP
2eea0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
2eeb0 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
2eec0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2eed0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2eee0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
2eef0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
2ef00 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
2ef10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2ef20 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
2ef30 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
2ef40 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2ef50 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20  R_READER;.  }.  
2ef60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ef70 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
2ef80 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
2ef90 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
2efa0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
2efb0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2efc0 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
2efd0 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
2efe0 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
2eff0 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
2f000 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
2f010 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
2f020 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2f030 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
2f040 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
2f050 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
2f060 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
2f070 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
2f080 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
2f090 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
2f0a0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
2f0b0 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
2f0c0 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74  r){.  if( (sqlit
2f0d0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2f0e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2f0f0 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67  )==0) ){.    pag
2f100 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
2f110 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
2f120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
2f130 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
2f140 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
2f150 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
2f160 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
2f170 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
2f180 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
2f190 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
2f1a0 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
2f1b0 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
2f1c0 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
2f1d0 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
2f1e0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2f1f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
2f200 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
2f210 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2f220 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
2f230 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
2f240 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
2f250 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
2f260 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
2f270 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
2f280 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
2f290 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
2f2a0 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
2f2b0 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
2f2c0 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
2f2d0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
2f2e0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
2f2f0 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
2f300 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
2f310 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
2f320 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
2f330 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
2f340 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
2f350 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
2f360 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
2f370 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
2f380 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
2f390 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
2f3a0 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
2f3b0 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
2f3c0 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
2f3d0 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
2f3e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2f3f0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
2f400 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
2f410 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
2f420 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
2f430 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
2f440 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
2f450 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
2f460 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
2f470 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
2f480 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
2f490 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
2f4a0 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
2f4b0 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
2f4c0 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
2f4d0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
2f4e0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
2f4f0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
2f500 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
2f510 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
2f520 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
2f530 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
2f540 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
2f550 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
2f560 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
2f570 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
2f580 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
2f590 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
2f5a0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
2f5b0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
2f5c0 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
2f5d0 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
2f5e0 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73  n two seperate s
2f5f0 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
2f600 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
2f610 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
2f620 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
2f630 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
2f640 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
2f650 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
2f660 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
2f670 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
2f680 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
2f690 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
2f6a0 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c  cache to be fill
2f6b0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
2f6c0 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
2f6d0 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
2f6e0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2f6f0 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
2f700 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
2f710 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
2f720 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
2f730 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
2f740 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2f750 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
2f760 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
2f770 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
2f780 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
2f790 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
2f7a0 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
2f7b0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
2f7c0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
2f7d0 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
2f7e0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
2f7f0 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
2f800 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
2f810 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
2f820 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
2f830 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
2f840 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
2f850 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
2f860 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
2f870 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
2f880 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
2f890 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
2f8a0 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
2f8b0 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
2f8c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
2f8d0 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
2f8e0 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
2f8f0 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
2f900 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
2f910 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
2f920 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
2f930 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
2f940 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
2f950 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
2f960 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
2f970 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
2f980 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
2f990 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
2f9a0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
2f9b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2f9c0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
2f9d0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
2f9e0 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
2f9f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
2fa00 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
2fa10 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
2fa20 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
2fa30 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
2fa40 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
2fa50 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
2fa60 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
2fa70 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
2fa80 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
2fa90 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
2faa0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
2fab0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
2fac0 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
2fad0 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
2fae0 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
2faf0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
2fb00 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
2fb10 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
2fb20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
2fb30 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
2fb40 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
2fb50 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
2fb60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fb70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2fb80 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2fb90 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
2fba0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
2fbb0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
2fbc0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
2fbd0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
2fbe0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
2fbf0 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
2fc00 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
2fc10 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
2fc20 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
2fc30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
2fc40 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
2fc50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2fc60 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
2fc70 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
2fc80 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2fc90 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
2fca0 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
2fcb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fcc0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2fcd0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2fce0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
2fcf0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
2fd00 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
2fd10 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
2fd20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
2fd30 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
2fd40 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
2fd50 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
2fd60 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
2fd70 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
2fd80 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2fd90 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  E_FULL ){.    rc
2fda0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
2fdb0 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
2fdc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
2fdd0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
2fde0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
2fdf0 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a  1, ppPage);.  }.
2fe00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2fe10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  E_OK ){.    /* E
2fe20 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
2fe30 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  o sqlite3PcacheF
2fe40 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20  etch() returned 
2fe50 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a  an error or the.
2fe60 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73      ** pager was
2fe70 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2fe80 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
2fe90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2fea0 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
2feb0 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61  * Set pPg to 0 a
2fec0 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  nd jump to the e
2fed0 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72  xception handler
2fee0 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  .  */.    pPg = 
2fef0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  0;.    goto page
2ff00 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
2ff10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
2ff20 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
2ff30 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
2ff40 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
2ff50 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70  r==pPager || (*p
2ff60 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
2ff70 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70  0 );..  if( (*pp
2ff80 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26  Page)->pPager &&
2ff90 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
2ffa0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
2ffb0 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
2ffc0 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
2ffd0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
2ffe0 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
2fff0 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
30000 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
30010 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
30020 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
30030 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
30040 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
30050 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41  Pager) );.    PA
30060 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
30070 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75  >nHit);.    retu
30080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
30090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
300a0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
300b0 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
300c0 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
300d0 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
300e0 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
300f0 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 50 41 47  ed.  */..    PAG
30100 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
30110 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 20  nMiss);.    pPg 
30120 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70  = *ppPage;.    p
30130 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
30140 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ger;..    /* The
30150 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
30160 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
30170 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
30180 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
30190 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
301a0 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
301b0 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63  r the unused loc
301c0 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65  king-page, is re
301d0 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20  quested. */.    
301e0 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
301f0 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
30200 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
30210 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
30220 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
30230 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
30240 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
30250 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
30260 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20     if( MEMDB || 
30270 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
30280 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f  int)pgno || noCo
30290 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e  ntent || !isOpen
302a0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
302b0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
302c0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
302d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
302e0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
302f0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
30300 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
30310 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
30320 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
30330 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
30340 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
30350 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
30360 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
30370 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
30380 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
30390 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
303a0 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
303b0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
303c0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
303d0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
303e0 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
303f0 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
30400 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
30410 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
30420 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
30430 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
30440 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
30450 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
30460 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
30470 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
30480 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
30490 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
304a0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
304b0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
304c0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
304d0 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
304e0 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
304f0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
30500 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
30510 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
30520 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
30530 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
30540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30550 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
30560 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
30570 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
30580 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
30590 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
305a0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
305b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
305c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
305d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
305e0 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
305f0 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
30600 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54  Size);.      IOT
30610 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
30620 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
30630 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
30640 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
30650 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
30660 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er );.      rc =
30670 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
30680 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
30690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
306a0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
306b0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
306c0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
306d0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
306e0 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
306f0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
30700 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
30710 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
30720 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
30730 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
30740 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
30750 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
30760 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
30770 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
30780 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
30790 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
307a0 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
307b0 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
307c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
307d0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
307e0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
307f0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
30800 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
30810 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
30820 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
30830 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
30840 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
30850 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
30860 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41   not in cache. A
30870 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66  lso, return 0 if
30880 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69   the .** pager i
30890 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  s in PAGER_UNLOC
308a0 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  K state when thi
308b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
308c0 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  lled,.** or if t
308d0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  he pager is in a
308e0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
308f0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
30900 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  FULL..**.** See 
30910 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
30920 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
30930 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
30940 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
30950 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
30960 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
30970 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
30980 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
30990 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
309a0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
309b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
309c0 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
309d0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
309e0 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
309f0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
30a00 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
30a10 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
30a20 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
30a30 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
30a40 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
30a50 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
30a60 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
30a70 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
30a80 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
30a90 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
30aa0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
30ab0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
30ac0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
30ad0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
30ae0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
30af0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
30b00 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
30b10 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
30b20 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg);.  return pP
30b30 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
30b40 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
30b50 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
30b60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
30b70 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
30b80 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
30b90 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
30ba0 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
30bb0 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
30bc0 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
30bd0 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
30be0 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
30bf0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
30c00 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
30c10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
30c20 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
30c30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
30c40 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
30c50 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
30c60 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
30c70 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
30c80 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  er;.    sqlite3P
30c90 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
30ca0 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  );.    pagerUnlo
30cb0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
30cc0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
30cd0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
30ce0 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
30cf0 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
30d00 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
30d10 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
30d20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
30d30 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
30d40 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
30d50 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
30d60 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
30d70 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
30d80 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
30d90 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
30da0 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
30db0 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
30dc0 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
30dd0 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
30de0 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
30df0 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
30e00 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
30e10 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
30e20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
30e30 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
30e40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
30e50 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
30e60 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
30e70 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
30e80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
30e90 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
30ea0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
30eb0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
30ec0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
30ed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
30ee0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
30ef0 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
30f00 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
30f10 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
30f20 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
30f30 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
30f40 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
30f50 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
30f60 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
30f70 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
30f80 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
30f90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30fa0 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
30fb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
30fc0 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
30fd0 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
30fe0 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
30ff0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
31000 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
31010 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
31020 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
31030 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
31040 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
31050 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
31060 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
31070 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
31080 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
31090 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
310a0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
310b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
310c0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
310d0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
310e0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
310f0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
31100 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
31110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31120 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
31130 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
31140 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
31150 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
31160 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
31170 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
31180 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
31190 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
311a0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
311b0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
311c0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
311d0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
311e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
311f0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
31200 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61    .  /* If alrea
31210 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
31220 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
31230 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
31240 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68    But on.  ** th
31250 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
31260 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
31270 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65  ver called if we
31280 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
31290 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74    ** an error st
312a0 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ate. */.  if( NE
312b0 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
312c0 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
312d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
312e0 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
312f0 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
31300 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
31310 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
31320 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
31330 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
31340 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
31350 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
31360 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  >dbSize);.    if
31370 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
31380 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rnal==0 ){.     
31390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
313a0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  OMEM;.    }.  . 
313b0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
313c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
313d0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
313e0 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   open. */.    if
313f0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
31400 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
31410 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
31420 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
31430 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
31440 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y ){.        sql
31450 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
31460 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
31470 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31480 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
31490 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
314a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
314b0 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
314c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
314d0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
314e0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
314f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
31500 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  E|.          (pP
31510 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f  ager->tempFile ?
31520 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53   .            (S
31530 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
31540 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
31550 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
31560 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  L):.            
31570 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
31580 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20  N_JOURNAL).     
31590 20 20 20 20 20 29 3b 0a 20 20 23 69 66 64 65 66       );.  #ifdef
315a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
315b0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
315c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
315d0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20  JournalOpen(.   
315e0 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
315f0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
31600 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
31610 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53  ags, jrnlBufferS
31620 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20  ize(pPager).    
31630 20 20 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a 20      );.  #else. 
31640 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31650 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
31660 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31670 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
31680 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e 64  lags, 0);.  #end
31690 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
316a0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
316b0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
316c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
316d0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20  .    }.  .  .   
316e0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
316f0 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
31700 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  er to the journa
31710 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20  l file and open 
31720 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
31730 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
31740 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
31750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
31770 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
31780 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
31790 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
317a0 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
317b0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
317c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
317d0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
317e0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
317f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
31800 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
31810 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
31820 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
31830 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
31840 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
31850 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
31860 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
31870 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
31880 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
31890 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
318a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
318b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
318c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
318d0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
318e0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
318f0 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
31900 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a  R_CACHEMOD;.  }.
31910 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31920 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
31930 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
31940 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
31950 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
31960 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
31970 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
31980 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
31990 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
319a0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
319b0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
319c0 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
319d0 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
319e0 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
319f0 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
31a00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31a10 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
31a20 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
31a30 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
31a40 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
31a50 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
31a60 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
31a70 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
31a80 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
31a90 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
31aa0 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
31ab0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
31ac0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
31ad0 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
31ae0 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
31af0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
31b00 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
31b10 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
31b20 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
31b30 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
31b40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
31b50 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
31b60 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
31b70 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
31b80 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
31b90 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
31ba0 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
31bb0 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
31bc0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
31bd0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
31be0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
31bf0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
31c00 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
31c10 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
31c20 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
31c30 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
31c40 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
31c50 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
31c60 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
31c70 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
31c80 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
31c90 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
31ca0 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
31cb0 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
31cc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
31cd0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
31ce0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
31cf0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
31d00 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  rrCode;.  assert
31d10 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
31d20 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
31d30 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
31d40 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  <PAGER_ERROR );.
31d50 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
31d60 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
31d70 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
31d80 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  ( ALWAYS(pPager-
31d90 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
31da0 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73  EADER) ){.    as
31db0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
31dc0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a  nJournal==0 );..
31dd0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
31de0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
31df0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
31e00 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72  ager is configur
31e10 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e  ed to use lockin
31e20 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
31e30 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a  , and an.      *
31e40 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  * exclusive lock
31e50 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31e60 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
31e70 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20  held, obtain it 
31e80 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  now..      */.  
31e90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
31ea0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
31eb0 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
31ec0 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
31ed0 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20  >pWal, -1) ){.  
31ee0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31ef0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
31f00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
31f10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
31f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31f30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
31f40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31f50 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78      sqlite3WalEx
31f60 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
31f70 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20  er->pWal, 1);.  
31f80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
31f90 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c  Grab the write l
31fa0 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66  ock on the log f
31fb0 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
31fc0 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20  ul, upgrade to. 
31fd0 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45       ** PAGER_RE
31fe0 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74  SERVED state. Ot
31ff0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
32000 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
32010 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
32020 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68     ** The busy-h
32030 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e  andler is not in
32040 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72  voked if another
32050 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65   connection alre
32060 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c  ady.      ** hol
32070 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  ds the write-loc
32080 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  k. If possible, 
32090 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
320a0 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20  will call it..  
320b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
320c0 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
320d0 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
320e0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
320f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32100 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45    /* Obtain a RE
32110 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
32120 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32130 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  . If the exFlag 
32140 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20  parameter.      
32150 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ** is true, then
32160 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67   immediately upg
32170 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20  rade this to an 
32180 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
32190 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73  The.      ** bus
321a0 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
321b0 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ck can be used w
321c0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f  hen upgrading to
321d0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20   the EXCLUSIVE. 
321e0 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75       ** lock, bu
321f0 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69  t not when obtai
32200 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45  ning the RESERVE
32210 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  D lock..      */
32220 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
32230 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
32240 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
32250 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32260 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61  LITE_OK && exFla
32270 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  g ){.        rc 
32280 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
32290 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
322a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
322b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
322c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
322d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  OK ){.      /* C
322e0 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f  hange to WRITER_
322f0 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20  LOCKED state..  
32300 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
32310 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61  WAL mode sets Pa
32320 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41  ger.eState to PA
32330 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
32340 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20  D or CACHEMOD.  
32350 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68      ** when it h
32360 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73  as an open trans
32370 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65  action, but neve
32380 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49  r to DBMOD or FI
32390 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a  NISHED..      **
323a0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
323b0 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73   in those states
323c0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c   the code to rol
323d0 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74  l back savepoint
323e0 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
323f0 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79  actions may copy
32400 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
32410 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ub-journal into 
32420 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
32430 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77      ** file as w
32440 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20  ell as into the 
32450 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63  page cache. Whic
32460 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72  h would be incor
32470 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a  rect in .      *
32480 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20  * WAL mode..    
32490 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
324a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
324b0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b  R_WRITER_LOCKED;
324c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
324d0 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
324e0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
324f0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
32500 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
32510 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
32520 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
32530 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
32540 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
32550 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
32560 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
32570 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
32580 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
32590 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
325a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
325b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
325c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
325d0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
325e0 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65  CKED );.    asse
325f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
32600 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
32610 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
32620 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE(("TRANSACTIO
32630 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
32640 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65  (pPager)));.  re
32650 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
32660 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20  * Mark a single 
32670 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
32680 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65  teable. The page
32690 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
326a0 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f   the .** main jo
326b0 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
326c0 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64  rnal as required
326d0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
326e0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
326f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   one of the jour
32700 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73  nals, the corres
32710 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
32720 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61  et in the .** Pa
32730 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
32740 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61  itvec and the Pa
32750 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
32760 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
32770 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e  s.** of any open
32780 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61   savepoints as a
32790 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
327a0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
327b0 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
327c0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
327d0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
327e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
327f0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
32800 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
32810 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72  OK;..  /* This r
32820 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61  outine is not ca
32830 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72  lled unless a wr
32840 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
32850 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a  has already .  *
32860 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20  * been started. 
32870 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
32880 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
32890 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20  be open at this 
328a0 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69  point..  ** It i
328b0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
328c0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
328d0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
328e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
328f0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
32900 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
32910 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32920 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
32930 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
32940 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32950 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
32960 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
32970 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
32980 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
32990 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
329a0 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69  r has been previ
329b0 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20  ously detected, 
329c0 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65 20  report the same 
329d0 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e  error.  ** again
329e0 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  . This should no
329f0 74 20 68 61 70 70 65 6e 2c 20 62 75 74 20 74 68  t happen, but th
32a00 65 20 63 68 65 63 6b 20 70 72 6f 76 69 64 65 73  e check provides
32a10 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
32a20 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
32a30 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20  er->errCode) )  
32a40 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
32a50 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69  rrCode;..  /* Hi
32a60 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69  gher-level routi
32a70 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74  nes never call t
32a80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
32a90 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a  database is not.
32aa0 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20    ** writable.  
32ab0 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79  But check anyway
32ac0 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73  , just for robus
32ad0 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20  tness. */.  if( 
32ae0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65  NEVER(pPager->re
32af0 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e  adOnly) ) return
32b00 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20   SQLITE_PERM;.. 
32b10 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
32b20 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
32b30 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
32b40 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
32b50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
32b60 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
32b70 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
32b80 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
32b90 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
32ba0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
32bb0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
32bc0 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  f( pageInJournal
32bd0 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65  (pPg) && !subjRe
32be0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
32bf0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
32c00 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
32c10 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  er) );.    asser
32c20 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
32c30 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
32c40 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 7d 65  CACHEMOD );.  }e
32c50 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
32c60 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
32c70 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
32c80 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
32c90 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
32ca0 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
32cb0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
32cc0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
32cd0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
32ce0 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
32cf0 20 20 20 2a 2a 20 48 69 67 68 65 72 20 6c 65 76     ** Higher lev
32d00 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  el routines have
32d10 20 61 6c 72 65 61 64 79 20 6f 62 74 61 69 6e 65   already obtaine
32d20 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
32d30 6c 6f 63 6b 73 0a 20 20 20 20 2a 2a 20 74 6f 20  locks.    ** to 
32d40 62 65 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d  begin the write-
32d50 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
32d60 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
32d70 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
32d80 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 20 6f  .    ** yet be o
32d90 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77  pen. Open it now
32da0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
32db0 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
32dc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
32dd0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
32de0 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
32df0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
32e00 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
32e10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
32e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
32e30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
32e40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32e50 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
32e60 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
32e70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
32e80 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
32e90 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 0a  e(pPager) );.  .
32ea0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
32eb0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
32ec0 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
32ed0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
32ee0 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
32ef0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
32f00 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
32f10 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
32f20 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
32f30 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
32f40 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
32f50 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
32f60 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
32f70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61    */.    if( !pa
32f80 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
32f90 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c   && !pagerUseWal
32fa0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
32fb0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
32fc0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
32fd0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
32fe0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
32ff0 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69  >dbOrigSize && i
33000 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
33010 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33  d) ){.        u3
33020 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
33030 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
33040 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 20         i64 iOff 
33050 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
33060 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f  lOff;..        /
33070 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
33080 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
33090 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
330a0 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
330b0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
330c0 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
330d0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
330e0 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
330f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
33100 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
33110 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
33120 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
33130 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
33140 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
33150 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
33160 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e  nalHdr<=pPager->
33170 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
33180 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
33190 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
331a0 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
331b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
331c0 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
331d0 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
331e0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
331f0 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20  )pData2);..     
33200 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e     /* Even if an
33210 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
33220 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
33230 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74  le journalling t
33240 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
33250 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  ge in the block 
33260 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e  above, set the n
33270 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f  eed-sync flag fo
33280 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  r the page..    
33290 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
332a0 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  , when the trans
332b0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
332c0 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63   back, the logic
332d0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   in.        ** p
332e0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
332f0 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68  () will think th
33300 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
33310 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
33320 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
33330 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33340 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65  . And if an IO e
33350 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
33360 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20  e doing so,.    
33370 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72      ** then corr
33380 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f  uption may follo
33390 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
333a0 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
333b0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
333c0 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63  YNC;..        rc
333d0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
333e0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66  Pager->jfd, iOff
333f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
33400 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33410 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
33420 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20   rc;.        rc 
33430 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
33440 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
33450 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
33460 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b  geSize, iOff+4);
33470 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
33480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
33490 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
334a0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
334b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
334c0 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ff+pPager->pageS
334d0 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20  ize+4, cksum);. 
334e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
334f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
33500 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49  n rc;..        I
33510 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
33520 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
33530 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
33540 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
33550 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
33560 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
33570 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
33580 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
33590 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
335a0 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
335b0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
335c0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
335d0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
335e0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
335f0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
33600 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
33610 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
33620 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
33630 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
33640 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
33650 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
33660 3b 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ;..        pPage
33670 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
33680 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67   8 + pPager->pag
33690 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70  eSize;.        p
336a0 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
336b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
336c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
336d0 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
336e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
336f0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
33700 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
33710 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
33720 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
33730 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
33740 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
33750 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
33760 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
33770 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61  .        rc |= a
33780 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
33790 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
337a0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
337b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
337c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
337d0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
337e0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
337f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
33800 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33820 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
33830 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te!=PAGER_WRITER
33840 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20  _DBMOD ){.      
33850 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
33860 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
33870 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  C;.        }.   
33880 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
33890 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
338a0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
338b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
338c0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
338d0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
338e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
338f0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
33900 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
33910 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
33920 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
33930 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
33940 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
33950 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
33960 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
33970 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
33980 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
33990 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
339a0 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
339b0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
339c0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
339d0 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
339e0 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
339f0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
33a00 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
33a10 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
33a20 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
33a30 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
33a40 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
33a50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
33a60 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
33a70 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
33a80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
33a90 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
33aa0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
33ab0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
33ac0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
33ad0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
33ae0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
33af0 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
33b00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33b10 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
33b20 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
33b30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
33b40 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
33b50 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63  ore .** making c
33b60 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
33b70 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
33b80 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
33b90 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  rn value .** of 
33ba0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
33bb0 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
33bc0 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70   to change any p
33bd0 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20  age data unless 
33be0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
33bf0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
33c00 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  OK..**.** The di
33c10 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
33c20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
33c30 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
33c40 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
33c50 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
33c60 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
33c70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
33c80 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
33c90 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
33ca0 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
33cb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
33cc0 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
33cd0 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
33ce0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
33cf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
33d00 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
33d10 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
33d20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
33d30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
33d40 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
33d50 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73  s returned.** as
33d60 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74   appropriate. Ot
33d70 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
33d80 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
33d90 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
33da0 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
33db0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33dc0 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
33dd0 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
33de0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
33df0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
33e00 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
33e10 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
33e20 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
33e30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 61  >pageSize);..  a
33e40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
33e50 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
33e60 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
33e70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33e80 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
33e90 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
33ea0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
33eb0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
33ec0 20 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65    if( nPagePerSe
33ed0 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67  ctor>1 ){.    Pg
33ee0 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20  no nPageCount;  
33ef0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
33f00 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
33f10 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
33f20 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67  e */.    Pgno pg
33f30 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
33f40 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
33f50 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
33f60 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
33f70 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  . */.    int nPa
33f80 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
33f90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33fa0 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61  pages starting a
33fb0 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c  t pg1 to journal
33fc0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   */.    int ii; 
33fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fe0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
33ff0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65  r */.    int nee
34000 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20  dSync = 0;      
34010 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
34020 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52  y page has PGHDR
34030 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20  _NEED_SYNC */.. 
34040 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f     /* Set the do
34050 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61  NotSyncSpill fla
34060 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20  g to 1. This is 
34070 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f  because we canno
34080 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61  t allow.    ** a
34090 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
340a0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
340b0 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
340c0 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20 20 20  journaled by.   
340d0 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
340e0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
340f0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
34100 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
34110 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
34120 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  ll==0 );.    pPa
34130 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
34140 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54  ill++;..    /* T
34150 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
34160 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
34170 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
34180 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
34190 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
341a0 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
341b0 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
341c0 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
341d0 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
341e0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
341f0 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
34200 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
34210 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
34220 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
34230 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
34240 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50  1)) + 1;..    nP
34250 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65  ageCount = pPage
34260 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 69  r->dbSize;.    i
34270 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
34280 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
34290 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
342a0 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
342b0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
342c0 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
342d0 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
342e0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
342f0 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
34300 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
34310 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
34320 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
34330 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
34340 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
34350 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
34360 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
34370 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
34380 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
34390 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
343a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
343b0 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
343c0 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
343d0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
343e0 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70  .      if( pg==p
343f0 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c  Pg->pgno || !sql
34400 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
34410 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
34420 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20  l, pg) ){.      
34430 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
34440 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
34450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
34460 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
34470 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
34480 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
34490 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
344a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
344b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
344c0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
344d0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
344e0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
344f0 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
34500 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
34510 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
34520 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
34530 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
34540 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
34550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
34560 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
34570 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
34580 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
34590 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
345a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
345b0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
345c0 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
345d0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
345e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
345f0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
34600 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
34610 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
34620 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  If the PGHDR_NEE
34630 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73  D_SYNC flag is s
34640 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
34650 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
34660 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
34670 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
34680 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
34690 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
346a0 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
346b0 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
346c0 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
346d0 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
346e0 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
346f0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
34700 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
34710 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
34720 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
34730 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
34740 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
34750 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
34760 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
34770 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
34790 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
347a0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
347b0 42 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  B );.      for(i
347c0 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69  i=0; ii<nPage; i
347d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
347e0 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
347f0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
34800 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
34810 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
34820 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
34830 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
34840 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
34850 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
34860 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
34870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34880 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
34890 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
348a0 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b  tSyncSpill==1 );
348b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
348c0 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20  otSyncSpill--;. 
348d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
348e0 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
348f0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
34900 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
34910 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
34920 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
34930 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
34940 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
34950 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
34960 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20  e3PagerWrite(). 
34970 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
34980 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
34990 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
349a0 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
349b0 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
349c0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
349d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
349e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50  rIswriteable(DbP
349f0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
34a00 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  urn pPg->flags&P
34a10 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65  GHDR_DIRTY;.}.#e
34a20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
34a30 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
34a40 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
34a50 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
34a60 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
34a70 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
34a80 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
34a90 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
34aa0 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
34ab0 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
34ac0 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
34ad0 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68  s dirty.  This h
34ae0 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
34af0 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ple, when.** the
34b00 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61   page has been a
34b10 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f  dded as a leaf o
34b20 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
34b30 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e  nd so its.** con
34b40 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d  tent no longer m
34b50 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atters..**.** Th
34b60 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
34b70 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
34b80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
34b90 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
34ba0 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
34bb0 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
34bc0 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  d. The pager mar
34bd0 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
34be0 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
34bf0 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
34c00 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
34c10 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
34c20 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
34c30 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61  mization can qua
34c40 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
34c50 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45   of large .** DE
34c60 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  LETE operations.
34c70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
34c80 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50  PagerDontWrite(P
34c90 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
34ca0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
34cb0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
34cc0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
34cd0 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61  DR_DIRTY) && pPa
34ce0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
34cf0 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  =0 ){.    PAGERT
34d00 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54  RACE(("DONT_WRIT
34d10 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
34d20 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
34d30 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
34d40 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
34d50 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
34d60 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
34d70 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61  o)).    pPg->fla
34d80 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54  gs |= PGHDR_DONT
34d90 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53  _WRITE;.#ifdef S
34da0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
34db0 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
34dc0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
34dd0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
34de0 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  f.  }.}../*.** T
34df0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
34e00 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
34e10 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nt the value of 
34e20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34e30 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75  e .** change-cou
34e40 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  nter, stored as 
34e50 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 4-byte big-end
34e60 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72  ian integer star
34e70 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65  ting at .** byte
34e80 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
34e90 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a  e pager file..**
34ea0 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72  .** If the isDir
34eb0 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73 20  ectMode flag is 
34ec0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
34ed0 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69  is done by calli
34ee0 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
34ef0 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61  gerWrite() on pa
34f00 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66  ge 1, then modif
34f10 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
34f20 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  s of the.** page
34f30 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63   data. In this c
34f40 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ase the file wil
34f50 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68 65  l be updated whe
34f60 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
34f70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
34f80 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
34f90 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   The isDirectMod
34fa0 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20  e flag may only 
34fb0 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  be non-zero if t
34fc0 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  he library was c
34fd0 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20  ompiled.** with 
34fe0 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
34ff0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d  E_ATOMIC_WRITE m
35000 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e  acro defined. In
35010 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
35020 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f  f isDirect is no
35030 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
35040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
35050 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63 74  s updated direct
35060 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67  ly.** by writing
35070 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72 73   an updated vers
35080 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73  ion of page 1 us
35090 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68  ing a call to th
350a0 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57  e .** sqlite3OsW
350b0 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rite() function.
350c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
350d0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
350e0 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
350f0 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72  Pager, int isDir
35100 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ectMode){.  int 
35110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35120 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35130 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35140 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
35150 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
35160 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35170 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
35180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
35190 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
351a0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
351b0 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69   Declare and ini
351c0 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74  tialize constant
351d0 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65   integer 'isDire
351e0 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  ct'. If the.  **
351f0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
35200 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
35210 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
35220 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65  ild, then isDire
35230 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69  ct.  ** is initi
35240 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61  alized to the va
35250 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
35260 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70  e isDirectMode p
35270 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f  arameter.  ** to
35280 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
35290 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
352a0 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a   always set to z
352b0 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ero..  **.  ** T
352c0 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
352d0 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  if the atomic-wr
352e0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
352f0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61   is not.  ** ena
35300 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
35310 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c  time, the compil
35320 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20  er can omit the 
35330 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69  tests of.  ** 'i
35340 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20  sDirect' below, 
35350 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
35360 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e  lock enclosed in
35370 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69   the.  ** "if( i
35380 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69  sDirect )" condi
35390 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tion..  */.#ifnd
353a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
353b0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20  _ATOMIC_WRITE.# 
353c0 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
353d0 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20 69  DE 0.  assert( i
353e0 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29  sDirectMode==0 )
353f0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
35400 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64  ETER(isDirectMod
35410 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  e);.#else.# defi
35420 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69  ne DIRECT_MODE i
35430 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64  sDirectMode.#end
35440 69 66 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  if..  if( !pPage
35450 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
35460 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  ne && pPager->db
35470 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67  Size>0 ){.    Pg
35480 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20  Hdr *pPgHdr;    
35490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
354a0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
354b0 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68   1 */.    u32 ch
354c0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20  ange_counter;   
354d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
354e0 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e  al value of chan
354f0 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
35500 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
35510 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
35520 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  le && isOpen(pPa
35530 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20  ger->fd) );..   
35540 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
35550 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
35560 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
35570 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35580 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
35590 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73  &pPgHdr);.    as
355a0 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20  sert( pPgHdr==0 
355b0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
355c0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
355d0 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63  age one was fetc
355e0 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  hed successfully
355f0 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
35600 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  ion is not.    *
35610 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64  * operating in d
35620 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65  irect-mode, make
35630 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65   page 1 writable
35640 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a  .  When not in .
35650 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f      ** direct mo
35660 64 65 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c  de, page 1 is al
35670 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63  ways held in cac
35680 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65  he and hence the
35690 20 50 61 67 65 72 47 65 74 28 29 0a 20 20 20 20   PagerGet().    
356a0 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61  ** above is alwa
356b0 79 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20  ys successful - 
356c0 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53  hence the ALWAYS
356d0 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   on rc==SQLITE_O
356e0 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  K..    */.    if
356f0 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26  ( !DIRECT_MODE &
35700 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c  & ALWAYS(rc==SQL
35710 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  ITE_OK) ){.     
35720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35730 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
35740 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
35750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35760 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  .      /* Increm
35770 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
35780 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
35790 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
357a0 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63  e 24. */.      c
357b0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
357c0 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
357d0 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46  (u8*)pPager->dbF
357e0 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20  ileVers);.      
357f0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
35800 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74  ;.      put32bit
35810 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
35820 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
35830 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
35840 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f       /* Also sto
35850 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
35860 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
35870 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
35880 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 74   in.      ** byt
35890 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20  es 92..95 store 
358a0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
358b0 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
358c0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a   version number.
358d0 20 20 20 20 20 20 2a 2a 20 69 73 20 76 61 6c 69        ** is vali
358e0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 75 74 33  d. */.      put3
358f0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
35900 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 32 2c  gHdr->pData)+92,
35910 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
35920 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74  ;.      put32bit
35930 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
35940 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c  ->pData)+96, SQL
35950 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
35960 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ER);..      /* I
35970 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72  f running in dir
35980 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  ect mode, write 
35990 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
359a0 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66 69  page 1 to the fi
359b0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  le. */.      if(
359c0 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a   DIRECT_MODE ){.
359d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
359e0 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20  id *zBuf;.      
359f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35a00 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29  ->dbFileSize>0 )
35a10 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32  ;.        CODEC2
35a20 28 70 50 61 67 65 72 2c 20 70 50 67 48 64 72 2d  (pPager, pPgHdr-
35a30 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c 20 72 63  >pData, 1, 6, rc
35a40 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a  =SQLITE_NOMEM, z
35a50 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Buf);.        if
35a60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
35a80 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
35a90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
35aa0 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
35ab0 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ize, 0);.       
35ac0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
35ad0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35ae0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
35af0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
35b00 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  e = 1;.        }
35b10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35b20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68        pPager->ch
35b30 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
35b40 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
35b50 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
35b60 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
35b70 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
35b80 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
35b90 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  gHdr);.  }.  ret
35ba0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
35bb0 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20   Sync the pager 
35bc0 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68  file to disk. Th
35bd0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  is is a no-op fo
35be0 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  r in-memory file
35bf0 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69  s.** or pages wi
35c00 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  th the Pager.noS
35c10 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ync flag set..**
35c20 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
35c30 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20  l, or called on 
35c40 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  a pager for whic
35c50 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c  h it is a no-op,
35c60 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
35c70 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
35c80 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
35c90 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
35ca0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
35cb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
35cc0 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
35cd0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
35ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35d00 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
35d10 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
35d20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
35d30 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
35d40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
35d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
35d60 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
35d70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
35d80 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
35d90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
35da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
35db0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
35dc0 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65   be called while
35dd0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
35de0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 69  tion is active i
35df0 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  n.** rollback. I
35e00 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
35e10 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
35e20 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
35e30 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72  no-op. .** Other
35e40 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e  wise, if the con
35e50 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  nection does not
35e60 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 6e   already have an
35e70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
35e80 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  on .** the datab
35e90 61 73 65 20 66 69 6c 65 2c 20 61 6e 20 61 74 74  ase file, an att
35ea0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
35eb0 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a  obtain one..**.*
35ec0 2a 20 49 66 20 74 68 65 20 45 58 43 4c 55 53 49  * If the EXCLUSI
35ed0 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  VE lock is alrea
35ee0 64 79 20 68 65 6c 64 20 6f 72 20 74 68 65 20 61  dy held or the a
35ef0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
35f00 20 69 74 20 69 73 0a 2a 2a 20 73 75 63 63 65 73   it is.** succes
35f10 73 66 75 6c 2c 20 6f 72 20 74 68 65 20 63 6f 6e  sful, or the con
35f20 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41  nection is in WA
35f30 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f 4f  L mode, SQLITE_O
35f40 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
35f50 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 65 69 74  * Otherwise, eit
35f60 68 65 72 20 53 51 4c 49 54 45 5f 42 55 53 59 20  her SQLITE_BUSY 
35f70 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  or an SQLITE_IOE
35f80 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
35f90 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
35fa0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
35fb0 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
35fc0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
35fd0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
35fe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
35ff0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36000 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
36010 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20 20 20 20  _CACHEMOD .     
36020 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
36030 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
36040 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20 20 20 20  R_DBMOD .       
36050 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
36060 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36070 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a 20 20 61  LOCKED .  );.  a
36080 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
36090 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
360a0 29 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70 61  ) );.  if( 0==pa
360b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
360c0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  ) ){.    rc = pa
360d0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
360e0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
360f0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  VE_LOCK);.  }.  
36100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36110 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
36120 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
36130 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
36140 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
36150 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
36160 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
36170 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
36180 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
36190 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
361a0 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
361b0 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
361c0 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
361d0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
361e0 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
361f0 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
36200 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
36210 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
36220 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
36230 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s that:.**.**   
36240 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
36250 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
36260 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  er is updated,.*
36270 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61  *   * the journa
36280 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c  l is synced (unl
36290 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ess the atomic-w
362a0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
362b0 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20  n is used),.**  
362c0 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67   * all dirty pag
362d0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  es are written t
362e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
362f0 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65  ile, .**   * the
36300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
36310 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20  s truncated (if 
36320 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a  required), and.*
36330 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
36340 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
36350 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
36360 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69  thing that remai
36370 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
36380 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
36390 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20  to finalize .** 
363a0 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
363b0 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69  e or zero the fi
363c0 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65  rst part of) the
363d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
363e0 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  r .** delete the
363f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
36400 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
36410 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
36420 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
36430 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
36440 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
36450 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
36460 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
36470 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
36480 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
36490 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
364a0 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
364b0 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
364c0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
364d0 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
364e0 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
364f0 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
36500 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
36510 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
36520 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
36530 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36540 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
36550 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
36560 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
36570 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
36580 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
36590 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
365a0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
365b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
365c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365d0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
365e0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
365f0 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20  r *zMaster,     
36600 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
36610 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65   NULL, the maste
36620 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
36630 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20  /.  int noSync  
36640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36650 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
36660 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e  mit the xSync on
36670 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
36680 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
36690 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
366a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
366b0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
366c0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
366d0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
366e0 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
366f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36700 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
36710 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
36720 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36730 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
36740 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
36750 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36760 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 20 20  ER_ERROR.  );.  
36770 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
36780 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
36790 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  r) );..  /* If a
367a0 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63   prior error occ
367b0 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74 68  urred, report th
367c0 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e 20  at error again. 
367d0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
367e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
367f0 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
36800 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47  >errCode;..  PAG
36810 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42 41  ERTRACE(("DATABA
36820 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
36830 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a   zMaster=%s nSiz
36840 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  e=%d\n", .      
36850 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
36860 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  e, zMaster, pPag
36870 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20  er->dbSize));.. 
36880 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61 62 61   /* If no databa
36890 73 65 20 63 68 61 6e 67 65 73 20 68 61 76 65 20  se changes have 
368a0 62 65 65 6e 20 6d 61 64 65 2c 20 72 65 74 75 72  been made, retur
368b0 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66  n early. */.  if
368c0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
368d0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  <PAGER_WRITER_CA
368e0 43 48 45 4d 4f 44 20 29 20 72 65 74 75 72 6e 20  CHEMOD ) return 
368f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
36900 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f  ( MEMDB ){.    /
36910 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
36920 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
36930 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
36940 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
36950 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66  or this.    ** f
36960 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
36970 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
36980 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20   it is mostly a 
36990 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c  no-op.  However,
369a0 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b   any.    ** back
369b0 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e  up in progress n
369c0 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 61  eeds to be resta
369d0 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rted..    */.   
369e0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
369f0 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
36a00 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  ackup);.  }else{
36a10 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
36a20 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
36a30 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69        PgHdr *pLi
36a40 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
36a50 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
36a60 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
36a70 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
36a80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
36a90 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
36aa0 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61 67  ger, pList, pPag
36ab0 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a  er->dbSize, 1, .
36ac0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61              (pPa
36ad0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20  ger->fullSync ? 
36ae0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
36af0 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  gs : 0).        
36b00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
36b30 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
36b40 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
36b50 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  che);.      }.  
36b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
36b70 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
36b80 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68  block updates th
36b90 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
36ba0 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74  . Exactly how it
36bb0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74  .      ** does t
36bc0 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  his depends on w
36bd0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
36be0 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20  e atomic-update 
36bf0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
36c00 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65     ** was enable
36c10 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
36c20 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74  e, and if this t
36c30 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73  ransaction meets
36c40 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72   the .      ** r
36c50 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20  untime criteria 
36c60 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61  to use the opera
36c70 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a  tion: .      **.
36c80 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68        **    * Th
36c90 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
36ca0 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69  pports the atomi
36cb0 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
36cc0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20   for.      **   
36cd0 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a     blocks of siz
36ce0 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
36cf0 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20   .      **    * 
36d00 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e  This commit is n
36d10 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  ot part of a mul
36d20 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
36d30 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  ion, and.      *
36d40 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f  *    * Exactly o
36d50 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  ne page has been
36d60 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74   modified and st
36d70 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ore in the journ
36d80 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  al file..      *
36d90 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
36da0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  e optimization w
36db0 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61  as not enabled a
36dc0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
36dd0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  then the.      *
36de0 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
36df0 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e  ngecounter() fun
36e00 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
36e10 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
36e20 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ange.      ** co
36e30 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65  unter in 'indire
36e40 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65  ct-mode'. If the
36e50 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
36e60 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74   compiled in but
36e70 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  .      ** is not
36e80 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74   applicable to t
36e90 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
36ea0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75   call sqlite3Jou
36eb0 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20  rnalCreate().   
36ec0 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75     ** to make su
36ed0 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  re the journal f
36ee0 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79  ile has actually
36ef0 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74   been created, t
36f00 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a  hen call.      *
36f10 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
36f20 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20  ngecounter() to 
36f30 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
36f40 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64  e-counter in ind
36f50 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d  irect.      ** m
36f60 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ode. .      **. 
36f70 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
36f80 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  e, if the optimi
36f90 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65  zation is both e
36fa0 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69  nabled and appli
36fb0 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20  cable,.      ** 
36fc0 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f  then call pager_
36fd0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
36fe0 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
36ff0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
37000 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 27 64  r.      ** in 'd
37010 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20  irect' mode. In 
37020 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
37030 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
37040 6e 65 76 65 72 20 62 65 0a 20 20 20 20 20 20 2a  never be.      *
37050 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  * created for th
37060 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
37070 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 64 65        */.  #ifde
37080 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
37090 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
370a0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
370b0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
370c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
370d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
370e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
370f0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
37100 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
37110 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
37120 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
37130 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37140 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
37150 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
37160 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  r && isOpen(pPag
37170 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  er->jfd) .      
37180 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
37190 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66  nalOff==jrnlBuff
371a0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a  erSize(pPager) .
371b0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
371c0 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72  ->dbSize>=pPager
371d0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20 20 20  ->dbOrigSize.   
371e0 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20      && (0==(pPg 
371f0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
37200 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
37210 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d  >pPCache)) || 0=
37220 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20  =pPg->pDirty).  
37230 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
37240 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20  * Update the db 
37250 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  file change coun
37260 74 65 72 20 76 69 61 20 74 68 65 20 64 69 72 65  ter via the dire
37270 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64 2e  ct-write method.
37280 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
37290 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
372a0 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65 20  will modify the 
372b0 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
372c0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65  entation of page
372d0 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   1 .        ** t
372e0 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70  o include the up
372f0 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75  dated change cou
37300 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72  nter and then wr
37310 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20 20  ite page 1 .    
37320 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
37330 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
37340 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
37350 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
37360 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  e .        ** pr
37370 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f  operty of the ho
37380 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  st file-system, 
37390 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
373a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
373b0 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
373c0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
373d0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
373e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
373f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
37400 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72  nalCreate(pPager
37410 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
37420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
37440 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
37450 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
37460 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ger, 0);.       
37470 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23 65 6c   }.      }.  #el
37480 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  se.      rc = pa
37490 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
374a0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
374b0 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20  );.  #endif.    
374c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
374d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
374e0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
374f0 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  ;.  .      /* If
37500 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
37510 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
37520 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
37530 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
37540 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64        ** being d
37550 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
37560 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
37570 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
37580 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
37590 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61  ** file. This ca
375a0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e  n only happen in
375b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
375c0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
375d0 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64    ** Before read
375e0 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77 69  ing the pages wi
375f0 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
37600 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
37610 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
37620 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
37630 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53  .dbSize, set dbS
37640 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
37650 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 74  value.      ** t
37660 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20 74  hat it took at t
37670 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
37680 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68  transaction. Oth
37690 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20 20  erwise, the.    
376a0 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
376b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
376c0 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61  return zeroed pa
376d0 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a  ges instead of .
376e0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67        ** reading
376f0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
37700 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
37710 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65 66      */.  #ifndef
37720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
37730 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
37740 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
37750 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  <pPager->dbOrigS
37760 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26 20 70  ize .       && p
37770 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
37780 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
37790 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20 20  LMODE_OFF.      
377a0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
377b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
377c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377d0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
377e0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
377f0 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20       const Pgno 
37800 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
37810 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f  _PGNO(pPager); /
37820 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70  * Pending lock p
37830 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  age */.        c
37840 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a 65  onst Pgno dbSize
37850 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
37860 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  e;       /* Data
37870 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65 20  base image size 
37880 2a 2f 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  */ .        pPag
37890 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
378a0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
378b0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d  .        for( i=
378c0 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61  dbSize+1; i<=pPa
378d0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
378e0 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
378f0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 69    if( !sqlite3Bi
37900 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
37910 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20  >pInJournal, i) 
37920 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20  && i!=iSkip ){. 
37930 20 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72             PgHdr
37940 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
37950 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
37960 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20  journal */.     
37970 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
37980 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
37990 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a  er, i, &pPage);.
379a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
379b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
379c0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
379d0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
379e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
379f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
37a00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
37a10 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
37a20 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
37a30 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
37a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
37a50 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
37a60 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
37a70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
37a80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
37a90 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a  bSize = dbSize;.
37aa0 20 20 20 20 20 20 7d 20 0a 20 20 23 65 6e 64 69        } .  #endi
37ab0 66 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 72  f.  .      /* Wr
37ac0 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
37ad0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
37ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37af0 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20 0a  e. If a master .
37b00 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
37b10 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
37b20 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
37b30 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
37b40 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 20 20  al file, .      
37b50 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72  ** or if zMaster
37b60 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73   is NULL (no mas
37b70 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68  ter journal), th
37b80 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  en this call is 
37b90 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a  a no-op..      *
37ba0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  /.      rc = wri
37bb0 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
37bc0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
37bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
37be0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
37bf0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
37c00 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
37c10 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
37c20 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 77 72  rnal file and wr
37c30 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
37c40 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
37c50 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  ase..      ** If
37c60 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
37c70 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
37c80 69 73 20 62 65 69 6e 67 20 75 73 65 64 2c 20 74  is being used, t
37c90 68 69 73 20 73 79 6e 63 20 77 69 6c 6c 20 6e 6f  his sync will no
37ca0 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  t .      ** crea
37cb0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
37cc0 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61  ile or perform a
37cd0 6e 79 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20  ny real IO..    
37ce0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65    **.      ** Be
37cf0 63 61 75 73 65 20 74 68 65 20 63 68 61 6e 67 65  cause the change
37d00 2d 63 6f 75 6e 74 65 72 20 70 61 67 65 20 77 61  -counter page wa
37d10 73 20 6a 75 73 74 20 6d 6f 64 69 66 69 65 64 2c  s just modified,
37d20 20 75 6e 6c 65 73 73 20 74 68 65 0a 20 20 20 20   unless the.    
37d30 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 75 70 64 61    ** atomic-upda
37d40 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
37d50 69 73 20 75 73 65 64 20 69 74 20 69 73 20 61 6c  is used it is al
37d60 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61  most certain tha
37d70 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a  t the.      ** j
37d80 6f 75 72 6e 61 6c 20 72 65 71 75 69 72 65 73 20  ournal requires 
37d90 61 20 73 79 6e 63 20 68 65 72 65 2e 20 48 6f 77  a sync here. How
37da0 65 76 65 72 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  ever, in locking
37db0 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 0a  _mode=exclusive.
37dc0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 79        ** on a sy
37dd0 73 74 65 6d 20 75 6e 64 65 72 20 6d 65 6d 6f 72  stem under memor
37de0 79 20 70 72 65 73 73 75 72 65 20 69 74 20 69 73  y pressure it is
37df0 20 6a 75 73 74 20 70 6f 73 73 69 62 6c 65 20 74   just possible t
37e00 68 61 74 20 74 68 69 73 20 69 73 20 0a 20 20 20  hat this is .   
37e10 20 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 63 61     ** not the ca
37e20 73 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  se. In this case
37e30 20 69 74 20 69 73 20 6c 69 6b 65 6c 79 20 65 6e   it is likely en
37e40 6f 75 67 68 20 74 68 61 74 20 74 68 65 20 72 65  ough that the re
37e50 64 75 6e 64 61 6e 74 0a 20 20 20 20 20 20 2a 2a  dundant.      **
37e60 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 20 77 69   xSync() call wi
37e70 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
37e80 20 61 20 6e 6f 2d 6f 70 20 62 79 20 74 68 65 20   a no-op by the 
37e90 4f 53 20 61 6e 79 68 6f 77 2e 20 0a 20 20 20 20  OS anyhow. .    
37ea0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
37eb0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
37ec0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  er, 0);.      if
37ed0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37ee0 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
37ef0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
37f00 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
37f10 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
37f20 28 70 50 61 67 65 72 2c 73 71 6c 69 74 65 33 50  (pPager,sqlite3P
37f30 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
37f40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
37f50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
37f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37f70 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
37f80 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
37f90 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20  OCKED );.       
37fa0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
37fb0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
37fc0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
37fd0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
37fe0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
37ff0 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  );.  .      /* I
38000 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
38010 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  sk is not the sa
38020 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64  me size as the d
38030 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20  atabase image,. 
38040 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65       ** then use
38050 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20   pager_truncate 
38060 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e  to grow or shrin
38070 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e  k the file here.
38080 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
38090 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
380a0 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze!=pPager->dbFi
380b0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
380c0 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50    Pgno nNew = pP
380d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28  ager->dbSize - (
380e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
380f0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
38100 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
38110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
38120 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
38130 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20  ITER_DBMOD );.  
38140 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
38150 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
38160 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
38170 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
38180 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
38190 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
381a0 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
381b0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79    /* Finally, sy
381c0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
381d0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  file. */.      i
381e0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
381f0 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
38200 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
38210 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
38220 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
38230 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
38240 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41     }.      IOTRA
38250 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
38260 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
38270 7d 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68  }.  }..commit_ph
38280 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20  ase_one_exit:.  
38290 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
382a0 4b 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  K && !pagerUseWa
382b0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
382c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
382d0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  = PAGER_WRITER_F
382e0 49 4e 49 53 48 45 44 3b 0a 20 20 7d 0a 20 20 72  INISHED;.  }.  r
382f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
38300 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
38310 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
38320 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
38330 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  ile has been com
38340 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74  pletely.** updat
38350 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ed to reflect th
38360 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
38370 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  y the current tr
38380 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  ansaction and.**
38390 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
383a0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
383b0 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69  e still exists i
383c0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
383d0 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e  m .** though, an
383e0 64 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  d if a failure o
383f0 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
38400 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e  int it will even
38410 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65  tually.** be use
38420 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
38430 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  al and the curre
38440 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  nt transaction r
38450 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
38460 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
38470 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
38480 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68  urnal file, eith
38490 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20  er by deleting, 
384a0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  .** truncating o
384b0 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f  r partially zero
384c0 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20  ing it, so that 
384d0 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  it cannot be use
384e0 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f  d .** for hot-jo
384f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
38500 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e  Once this is don
38510 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
38520 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61  n is.** irrevoca
38530 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  bly committed..*
38540 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
38550 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
38560 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
38570 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
38580 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74  ger.** moves int
38590 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
385a0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
385b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
385c0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
385d0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
385e0 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
385f0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
38600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
38610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38620 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
38630 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
38640 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ne should not be
38650 20 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69   called if a pri
38660 6f 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  or error has occ
38670 75 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  urred..  ** But 
38680 69 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64  if (due to a cod
38690 69 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68  ing error elsewh
386a0 65 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65  ere in the syste
386b0 6d 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20  m) it does get. 
386c0 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74   ** called, just
386d0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
386e0 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68   error code with
386f0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
38700 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ng. */.  if( NEV
38710 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->