/ Hex Artifact Content
Login

Artifact bd4867fbbe328bbb5f0669d60e3c16ac03dd776f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   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 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, 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 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le */.#ifndef SQ
7c50: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
7c60: 52 45 4e 54 0a 20 20 42 69 74 76 65 63 20 2a 70  RENT.  Bitvec *p
7c70: 41 6c 6c 52 65 61 64 3b 20 20 20 20 20 20 20 20  AllRead;        
7c80: 20 20 20 2f 2a 20 50 61 67 65 73 20 72 65 61 64     /* Pages read
7c90: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
7ca0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
7cb0: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73 71  . */.#endif.  sq
7cc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20  lite3_file *fd; 
7cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
7ce0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7cf0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
7d00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
7d10: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
7d20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7d30: 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  r main journal *
7d40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
7d50: 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20   *sjfd;         
7d60: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
7d70: 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  or for sub-journ
7d80: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  al */.  i64 jour
7d90: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
7da0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77      /* Current w
7db0: 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  rite offset in t
7dc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7dd0: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
7de0: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
7df0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
7e00: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
7e10: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
7e20: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
7e30: 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50  pBackup;    /* P
7e40: 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f  ointer to list o
7e50: 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70  f ongoing backup
7e60: 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20   processes */.  
7e70: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
7e80: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
7e90: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
7ea0: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
7eb0: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7ed0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
7ee0: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
7ef0: 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74 61 56   */.  u32 iDataV
7f00: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
7f10: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
7f20: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 63  never database c
7f30: 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73 20 2a  ontent changes *
7f40: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
7f50: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
7f60: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
7f70: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
7f80: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20 20  e changes */..  
7f90: 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20  int nMmapOut;   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7fb0: 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61  umber of mmap pa
7fc0: 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75  ges currently ou
7fd0: 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73  tstanding */.  s
7fe0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
7ff0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65  map;       /* De
8000: 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d  sired maximum mm
8010: 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48  ap size */.  PgH
8020: 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73  dr *pMmapFreelis
8030: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t;       /* List
8040: 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61   of free mmap pa
8050: 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72  ge headers (pDir
8060: 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ty) */.  /*.  **
8070: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
8080: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
8090: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
80a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
80f0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
8100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
8110: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
8120: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
8130: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
8140: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
8150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8160: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
8170: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
8180: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
8190: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
81a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
81b0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
81c0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
81d0: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
81e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
81f0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
8200: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
8210: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
8220: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8230: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8240: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
8250: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
8260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8270: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
8280: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
8290: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
82a0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
82b0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
82c0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
82d0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
82e0: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
82f0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
8300: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
8310: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8320: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
8330: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
8340: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8350: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8360: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
8370: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
8380: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
8390: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
83a0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
83b0: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
83c0: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
83d0: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
83e0: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
83f0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
8400: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
8410: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
8420: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
8430: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8440: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8470: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8480: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8490: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
84a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
84b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
84c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
84d0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
84e0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
84f0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
8500: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
8510: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
8520: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
8530: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8540: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8550: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8560: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8570: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8580: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8590: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
85a0: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
85b0: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
85c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
85d0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
85e0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
85f0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
8600: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
8610: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
8620: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
8630: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
8640: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8650: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8660: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8670: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8680: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8690: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
86a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
86b0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
86c0: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
86d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
86e0: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
86f0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
8700: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
8710: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
8720: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
8730: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
8740: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8750: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65  f.};../*.** Inde
8760: 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  xes for use with
8770: 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20   Pager.aStat[]. 
8780: 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b  The Pager.aStat[
8790: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
87a0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
87b0: 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69  ccessed by passi
87c0: 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  ng SQLITE_DBSTAT
87d0: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41  US_CACHE_HIT, CA
87e0: 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20  CHE_MISS .** or 
87f0: 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73  CACHE_WRITE to s
8800: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
8810: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ()..*/.#define P
8820: 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20  AGER_STAT_HIT   
8830: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
8840: 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65  STAT_MISS  1.#de
8850: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8860: 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54  WRITE 2../*.** T
8870: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
8880: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
8890: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
88a0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
88b0: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
88c0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
88d0: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
88e0: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
88f0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
8900: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
8910: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
8920: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8930: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
8940: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
8950: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8960: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8970: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
8980: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8990: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
89a0: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
89b0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
89c0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
89d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
89e0: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
89f0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8a00: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
8a10: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
8a20: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
8a30: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
8a40: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
8a50: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
8a60: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
8a70: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
8a80: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
8a90: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
8aa0: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
8ab0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
8ac0: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
8ad0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
8ae0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
8af0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
8b00: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
8b10: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
8b20: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
8b30: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
8b40: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
8b50: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
8b60: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
8b70: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8b80: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
8b90: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
8ba0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
8bb0: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
8bc0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
8bd0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
8be0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
8bf0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
8c00: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
8c10: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
8c20: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
8c30: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
8c40: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
8c50: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c60: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
8c70: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
8c80: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
8c90: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
8ca0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
8cb0: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
8cc0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8cd0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
8ce0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8cf0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
8d00: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
8d10: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
8d20: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
8d30: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
8d40: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
8d50: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
8d60: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
8d70: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
8d80: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
8d90: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
8da0: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
8db0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
8dc0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
8dd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
8de0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
8df0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
8e00: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
8e10: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
8e20: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
8e30: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
8e40: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
8e50: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
8e60: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
8e70: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
8e80: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
8e90: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
8ea0: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
8eb0: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
8ec0: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
8ed0: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
8ee0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
8ef0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
8f00: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
8f10: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
8f20: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
8f30: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
8f40: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
8f50: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
8f60: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
8f70: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
8f80: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8f90: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
8fa0: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
8fb0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
8fc0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
8fd0: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
8fe0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
8ff0: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
9000: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
9010: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
9020: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
9030: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
9040: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
9050: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
9060: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
9070: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
9080: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9090: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
90a0: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
90b0: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
90c0: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
90d0: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
90e0: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
90f0: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
9100: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
9110: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
9120: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
9130: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
9140: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
9150: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
9160: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
9170: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
9180: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
9190: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
91a0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
91b0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
91c0: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
91d0: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
91e0: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
91f0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
9200: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
9210: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
9220: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
9230: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
9240: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
9250: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
9260: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
9270: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
9280: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
9290: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
92a0: 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20  cro USEFETCH is 
92b0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
92c0: 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68  llowed to use th
92d0: 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e  e xFetch and xUn
92e0: 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61  fetch.** interfa
92f0: 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  ces to access th
9300: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
9310: 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49   memory-mapped I
9320: 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  /O..*/.#if SQLIT
9330: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
9340: 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  0.# define USEFE
9350: 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73  TCH(x) ((x)->bUs
9360: 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20  eFetch).#else.# 
9370: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9380: 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x) 0.#endif../*.
9390: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
93a0: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
93b0: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
93c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
93d0: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
93e0: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
93f0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
9400: 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65   macro is a file
9410: 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70   descriptor (typ
9420: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e sqlite3_file*)
9430: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
9440: 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c   it is not open,
9450: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75   or non-zero (bu
9460: 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69  t not 1) if it i
9470: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
9480: 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73   so that express
9490: 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74  ions can be writ
94a0: 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
94b0: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
94c0: 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a  r->jfd) ){ ....*
94d0: 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a  *.** instead of.
94e0: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67  **.**   if( pPag
94f0: 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
9500: 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66  s ){ ....*/.#def
9510: 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20  ine isOpen(pFd) 
9520: 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73  ((pFd)->pMethods
9530: 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  !=0)../*.** Retu
9540: 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20  rn true if this 
9550: 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69  pager uses a wri
9560: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73  te-ahead log ins
9570: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
9580: 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  l.** rollback jo
9590: 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65  urnal. Otherwise
95a0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64   false..*/.#ifnd
95b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
95c0: 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  AL.static int pa
95d0: 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20  gerUseWal(Pager 
95e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
95f0: 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  rn (pPager->pWal
9600: 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  !=0);.}.#else.# 
9610: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9620: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9630: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
9640: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
9650: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
9660: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
9670: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
9680: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9690: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
96a0: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
96b0: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
96c0: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
96d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
96e0: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
96f0: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9700: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9710: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9720: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
9730: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
9740: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
9750: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
9760: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
9770: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
9780: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9790: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
97a0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
97b0: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
97c0: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
97d0: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
97e0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
97f0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9800: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
9810: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9820: 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
9830: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9840: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
9850: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
9860: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9870: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
9880: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9890: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
98a0: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
98b0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
98c0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
98d0: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
98e0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
98f0: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9900: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9910: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9920: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
9930: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
9940: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
9950: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
9960: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
9970: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9980: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9990: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
99a0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
99b0: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
99c0: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
99d0: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
99e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
99f0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9a00: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9a10: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9a20: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9a30: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
9a40: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
9a50: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
9a60: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
9a70: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
9a80: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9a90: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
9aa0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
9ab0: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
9ac0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9ad0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
9ae0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9af0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9b00: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9b10: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
9b20: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
9b30: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9b40: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
9b50: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
9b60: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
9b70: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
9b80: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
9b90: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
9ba0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9bb0: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
9bc0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
9bd0: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
9be0: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
9bf0: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
9c00: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
9c10: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
9c20: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
9c30: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
9c40: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
9c50: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
9c60: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
9c70: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
9c80: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
9c90: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
9ca0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
9cb0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
9cc0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
9cd0: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
9ce0: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
9cf0: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
9d00: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
9d10: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
9d20: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
9d30: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
9d40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
9d50: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
9d60: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20   !isOpen(p->fd) 
9d70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9d80: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20  ->noSync );.    
9d90: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9da0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9db0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
9dc0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
9dd0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9de0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
9df0: 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ORY .    );.    
9e00: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
9e10: 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
9e20: 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  & p->eState!=PAG
9e30: 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61  ER_OPEN );.    a
9e40: 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
9e50: 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  al(p)==0 );.  }.
9e60: 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43  .  /* If changeC
9e70: 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c  ountDone is set,
9e80: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
9e90: 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
9ea0: 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e   be held.  ** on
9eb0: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
9ec0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9ed0: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
9ee0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9ef0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
9f00: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
9f10: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44  ( p->eLock!=PEND
9f20: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73  ING_LOCK );..  s
9f30: 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65  witch( p->eState
9f40: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47   ){.    case PAG
9f50: 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61  ER_OPEN:.      a
9f60: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
9f70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f80: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
9f90: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9fa0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
9fb0: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
9fc0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
9fd0: 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  )==0 || pPager->
9fe0: 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
9ff0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a000: 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a  se PAGER_READER:
a010: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a020: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a030: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a040: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a050: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
a060: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a070: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  t( p->eLock>=SHA
a080: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
a090: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a0a0: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a0b0: 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73  LOCKED:.      as
a0c0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a0d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
a0e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a0f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a100: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a110: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
a120: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
a130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a140: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a150: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
a160: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a170: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a  OMIT_CONCURRENT.
a180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a190: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50  ager->dbSize==pP
a1a0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a1b0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c   || pPager->pAll
a1c0: 52 65 61 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20  Read );.#endif. 
a1d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a1e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a1f0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a200: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a210: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a220: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a230: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a240: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a250: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a260: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a270: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a280: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a290: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a2a0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a2b0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a2c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a2d0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a2e0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a2f0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a300: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a310: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a320: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a330: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a340: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a350: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a360: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a370: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a380: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a390: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a3a0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a3b0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a3c0: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a3d0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a3e0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a3f0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a400: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a410: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a420: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a430: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a440: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a450: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a460: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a470: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a480: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a490: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a4a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a4b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a4c0: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a4d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a4e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a4f0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a500: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a510: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a520: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a530: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a540: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a550: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a560: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
a570: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a580: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a590: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a5a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a5b0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a5c0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a5d0: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a5e0: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a5f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a600: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a610: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a620: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a630: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a640: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a650: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a660: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a670: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a680: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a690: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a6a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a6b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a6c0: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a6d0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a6e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a6f0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a700: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a710: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a720: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a730: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a740: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a750: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a760: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a770: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a780: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a790: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a7a0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a7b0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a7c0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a7d0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a7e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a7f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a800: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a810: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a820: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a830: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a840: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a850: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a860: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a870: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a880: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a890: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a8a0: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a8b0: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a8c0: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a8d0: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a8e0: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a8f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a900: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a910: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a920: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a930: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a940: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a950: 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 50  pPCache)>0 || pP
a960: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
a970: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a980: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a990: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a9a0: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a9b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a9c0: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a9d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a9e0: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a9f0: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
aa00: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
aa10: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
aa20: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
aa30: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
aa40: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
aa50: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
aa60: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
aa70: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
aa80: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
aa90: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
aaa0: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
aab0: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
aac0: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
aad0: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
aae0: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
aaf0: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
ab00: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
ab10: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
ab20: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
ab30: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
ab40: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
ab50: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
ab60: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
ab70: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
ab80: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
ab90: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
aba0: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
abb0: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
abc0: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
abd0: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
abe0: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
abf0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
ac00: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
ac10: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
ac20: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
ac30: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
ac40: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
ac50: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
ac60: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
ac70: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
ac80: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
ac90: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
aca0: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
acb0: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
acc0: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
acd0: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
ace0: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
acf0: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
ad00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ad10: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
ad20: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
ad30: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
ad40: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
ad50: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
ad60: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
ad70: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ad80: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ad90: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
ada0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
adb0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
adc0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
add0: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
ade0: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
adf0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ae00: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
ae10: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
ae20: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
ae30: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ae40: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
ae50: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
ae60: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ae70: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
ae80: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ae90: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
aea0: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
aeb0: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
aec0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
aed0: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
aee0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
aef0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
af00: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
af10: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
af20: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
af30: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
af40: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
af50: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
af60: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
af70: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
af80: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
af90: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
afa0: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
afb0: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
afc0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
afd0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
afe0: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
aff0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b000: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b010: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
b020: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
b030: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
b040: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b050: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
b060: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
b070: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
b080: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b090: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
b0a0: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
b0b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
b0c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
b0d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
b0e0: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
b0f0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b100: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b110: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
b120: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
b130: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b140: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
b150: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
b160: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
b170: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
b180: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
b190: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
b1a0: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
b1b0: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
b1c0: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
b1d0: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
b1e0: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
b1f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b200: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
b210: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
b220: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
b230: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b240: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
b250: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
b260: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
b270: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
b280: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
b290: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
b2a0: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
b2b0: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
b2c0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b2d0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
b2e0: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
b2f0: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
b300: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
b310: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b320: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
b330: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
b340: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
b350: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b360: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b370: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b380: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b390: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b3a0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b3b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
b3c0: 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  p;.  Pgno pgno =
b3d0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e   pPg->pgno;.  in
b3e0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b3f0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b400: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
b410: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
b420: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
b430: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
b440: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
b450: 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
b460: 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  l(p->pInSavepoin
b470: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b480: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b490: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b4a0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
b4b0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
b4c0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b4d0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b4e0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b4f0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b500: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b510: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b520: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b530: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b540: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b550: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b560: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64  g->pgno);.}.#end
b570: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
b580: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b590: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
b5a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b5b0: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
b5c0: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
b5d0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
b5e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
b5f0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
b600: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
b610: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b620: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b630: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
b640: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
b650: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
b660: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
b670: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
b680: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b690: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b6a0: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
b6b0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
b6c0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
b6d0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
b6e0: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
b6f0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
b700: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b710: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
b720: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
b730: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b740: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b750: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b760: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
b770: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
b780: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
b790: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
b7a0: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
b7b0: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
b7c0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
b7d0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b7e0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
b7f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
b800: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
b810: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
b820: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
b830: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b840: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
b850: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
b860: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b870: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b880: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
b890: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
b8a0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
b8b0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b8c0: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
b8d0: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
b8e0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b8f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b900: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
b910: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
b920: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f  her NO_LOCK.** o
b930: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52  r SHARED_LOCK. R
b940: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
b950: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
b960: 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28  call to xUnlock(
b970: 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73  ).** succeeds, s
b980: 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f  et the Pager.eLo
b990: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  ck variable to m
b9a0: 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70  atch the (attemp
b9b0: 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a  ted) new lock..*
b9c0: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b9d0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b9e0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b9f0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
ba00: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
ba10: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
ba20: 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f  y it. See the co
ba30: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
ba40: 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55  #define of .** U
ba50: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
ba60: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
ba70: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
ba80: 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63  c int pagerUnloc
ba90: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
baa0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
bab0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
bac0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
bad0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
bae0: 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
baf0: 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29  ->eLock==eLock )
bb00: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
bb10: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
bb20: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
bb30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
bb40: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
bb50: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
bb60: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  er)==0 );.  if( 
bb70: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
bb80: 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
bb90: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
bba0: 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63  =eLock );.    rc
bbb0: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63   = pPager->noLoc
bbc0: 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  k ? SQLITE_OK : 
bbd0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
bbe0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63  pPager->fd, eLoc
bbf0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  k);.    if( pPag
bc00: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
bc10: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  WN_LOCK ){.     
bc20: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
bc30: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
bc40: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
bc50: 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  UNLOCK %p %d\n",
bc60: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bc70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bc80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
bc90: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bca0: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
bcb0: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
bcc0: 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f  either SHARED_LO
bcd0: 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f  CK,.** RESERVED_
bce0: 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56  LOCK or EXCLUSIV
bcf0: 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63  E_LOCK. If the c
bd00: 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73  aller is success
bd10: 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20  ful, set the.** 
bd20: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
bd30: 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20  able to the new 
bd40: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a  locking state. .
bd50: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
bd60: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
bd70: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
bd80: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
bd90: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61  nction is .** ca
bda0: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
bdb0: 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68  ify it unless th
bdc0: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
bdd0: 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45  ate is EXCLUSIVE
bde0: 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74  _LOCK. .** See t
bdf0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
be00: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
be10: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
be20: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
be30: 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  .** of this..*/.
be40: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
be50: 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  LockDb(Pager *pP
be60: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
be70: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
be80: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
be90: 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  t( eLock==SHARED
bea0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
beb0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
bec0: 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
bed0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
bee0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c  pPager->eLock<eL
bef0: 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ock || pPager->e
bf00: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
bf10: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  CK ){.    rc = p
bf20: 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20  Pager->noLock ? 
bf30: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
bf40: 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
bf50: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
bf60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bf70: 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e  _OK && (pPager->
bf80: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
bf90: 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  OCK||eLock==EXCL
bfa0: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20  USIVE_LOCK) ){. 
bfb0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
bfc0: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
bfd0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
bfe0: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bff0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
c000: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c010: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
c020: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
c030: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
c040: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
c050: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
c060: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
c070: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
c080: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
c090: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
c0a0: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
c0b0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
c0c0: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
c0d0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
c0e0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
c0f0: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
c100: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
c110: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
c120: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
c130: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c140: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
c150: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
c160: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
c170: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
c180: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
c190: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
c1a0: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
c1b0: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
c1c0: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
c1d0: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
c1e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c1f0: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
c200: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
c210: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
c220: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
c230: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
c240: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
c250: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
c260: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
c270: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
c280: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
c290: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c2a0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
c2b0: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
c2c0: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
c2d0: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
c2e0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c2f0: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
c300: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
c310: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
c320: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c330: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c340: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
c350: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
c360: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c380: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
c390: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
c3a0: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
c3d0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
c3e0: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c400: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
c410: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
c420: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
c430: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
c440: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
c450: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
c460: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
c470: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
c480: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
c490: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
c4a0: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
c4b0: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c4c0: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
c4d0: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
c4e0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c4f0: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
c500: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
c510: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
c520: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
c530: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
c540: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
c550: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c560: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c570: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c580: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
c590: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
c5a0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
c5b0: 65 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  e jrnlBufferSize
c5c0: 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 0.#endif../*
c5d0: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
c5e0: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
c5f0: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
c600: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
c610: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
c620: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
c630: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
c640: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
c650: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
c660: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
c670: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
c680: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
c690: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
c6a0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
c6b0: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
c6c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
c6d0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
c6e0: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
c6f0: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
c700: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
c710: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
c720: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
c730: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
c740: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
c750: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
c760: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
c770: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
c780: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c790: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
c7a0: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
c7b0: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
c7c0: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
c7d0: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
c7e0: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
c7f0: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
c800: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c810: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
c820: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c830: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
c840: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
c850: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
c860: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
c870: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
c880: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c890: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
c8a0: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
c8b0: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
c8c0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c8d0: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
c8e0: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
c8f0: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
c900: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
c910: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
c920: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
c930: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
c940: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
c950: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
c960: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
c970: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
c980: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
c990: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c9a0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
c9b0: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
c9c0: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
c9d0: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
c9e0: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
c9f0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
ca00: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
ca10: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
ca20: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
ca30: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
ca40: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
ca50: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
ca60: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
ca70: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
ca80: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
ca90: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
caa0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
cab0: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
cac0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
cad0: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
cae0: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
caf0: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
cb00: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
cb10: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cb20: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
cb30: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
cb40: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
cb50: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
cb60: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
cb70: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
cb80: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
cb90: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
cba0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
cbb0: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
cbc0: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
cbd0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cbe0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
cbf0: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
cc00: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
cc10: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
cc20: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
cc30: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
cc40: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
cc50: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
cc60: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
cc70: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
cc80: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
cc90: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
cca0: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
ccb0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
ccc0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
ccd0: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
cce0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
ccf0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
cd00: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
cd10: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
cd20: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
cd30: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
cd40: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
cd50: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
cd60: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
cd70: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
cd80: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
cd90: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
cda0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cdb0: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
cdc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
cdd0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
cde0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
cdf0: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
ce00: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
ce10: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
ce20: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
ce30: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
ce40: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
ce50: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
ce60: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
ce70: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
ce80: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
ce90: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
cea0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
ceb0: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
cec0: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
ced0: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
cee0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
cef0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
cf00: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
cf10: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
cf20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
cf30: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
cf40: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
cf50: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
cf60: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
cf70: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
cf80: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
cf90: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
cfa0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfc0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
cfd0: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cff0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
d000: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
d010: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
d020: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d040: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
d050: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
d060: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
d070: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
d080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
d090: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
d0a0: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
d0b0: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0d0: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
d0e0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d0f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
d100: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
d110: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
d120: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
d130: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
d140: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
d150: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d160: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d170: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
d180: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
d190: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d1a0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d1b0: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
d1c0: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
d1d0: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65  Master .   || le
d1e0: 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49  n==0 .   || SQLI
d1f0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
d200: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
d210: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
d220: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d230: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d240: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
d250: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
d260: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
d270: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
d280: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
d290: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d2a0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
d2b0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
d2c0: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
d2d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d2e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
d2f0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
d300: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
d310: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
d320: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
d330: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
d340: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
d350: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
d360: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
d370: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
d380: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
d390: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
d3a0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
d3b0: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
d3c0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
d3d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
d3e0: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
d3f0: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
d400: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
d410: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
d420: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
d430: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
d440: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
d450: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
d460: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
d470: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
d480: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
d490: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
d4a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d4b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
d4c0: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
d4d0: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
d4e0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d4f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
d500: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
d510: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
d520: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
d530: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
d540: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
d550: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
d560: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
d570: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
d580: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
d590: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
d5a0: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
d5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5d0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
d640: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
d650: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
d660: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
d670: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
d680: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
d690: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
d6a0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
d6b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d6c0: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d6d0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d6e0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
d6f0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d700: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d710: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d720: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d730: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d740: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d750: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d760: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d770: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d780: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d790: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d7a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d7b0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d7c0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d7d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d7e0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d7f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d800: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d810: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d820: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d830: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d840: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d850: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d860: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d870: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d880: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d890: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d8a0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d8b0: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d8c0: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d8d0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d8e0: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d8f0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d900: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d910: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d920: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d930: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d940: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d950: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d960: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d970: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d980: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d990: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d9a0: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d9b0: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d9c0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d9d0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d9e0: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d9f0: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
da00: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
da10: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
da20: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
da30: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
da40: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
da50: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
da60: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
da70: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
da80: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
da90: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
daa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
dab0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
dac0: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
dad0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
dae0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
daf0: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
db00: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
db10: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
db20: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
db30: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
db40: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
db50: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
db60: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
db70: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
db80: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
db90: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
dba0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
dbb0: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
dbc0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
dbd0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dc00: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
dc10: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
dc20: 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
dc30: 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e  t( !sqlite3Journ
dc40: 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
dc50: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
dc60: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
dc70: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
dc80: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
dc90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
dca0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
dcb0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
dcc0: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
dcd0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
dce0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
dcf0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
dd00: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
dd10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dd20: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
dd30: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
dd40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dd50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
dd60: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
dd70: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
dd80: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
dd90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
dda0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
ddb0: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
ddc0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ddd0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
dde0: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
ddf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
de00: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
de10: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
de20: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
de30: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
de40: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
de50: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
de60: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
de70: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
de80: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
de90: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
dea0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
deb0: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
dec0: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
ded0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
dee0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
def0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
df00: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
df10: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
df20: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
df30: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
df40: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
df50: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
df60: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
df70: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
df80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
df90: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
dfa0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
dfb0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
dfc0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
dfd0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
dfe0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
dff0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
e000: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
e010: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e020: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
e030: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e040: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
e050: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
e060: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e070: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
e090: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
e0a0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
e0b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e0c0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
e0d0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
e0e0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
e0f0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
e100: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e110: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
e120: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
e130: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
e140: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
e150: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
e160: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
e170: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
e180: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
e190: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
e1a0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
e1b0: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
e1c0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
e1d0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
e1e0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
e1f0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
e200: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
e210: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
e220: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
e230: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
e240: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
e250: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
e260: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
e270: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
e280: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
e290: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
e2a0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
e2b0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e2c0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
e2d0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
e2e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
e2f0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
e300: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
e310: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e330: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e340: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
e350: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
e360: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
e370: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
e380: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
e390: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
e3a0: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
e3b0: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
e3c0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
e3d0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
e3e0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
e3f0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
e400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e410: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
e420: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e430: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e460: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e470: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e480: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e490: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e4a0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e4b0: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e4c0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e4d0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e4e0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e4f0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e500: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e510: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e520: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e530: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e540: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e550: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e560: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e570: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e580: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e590: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e5a0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e5b0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e5c0: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e5d0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e5e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e5f0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e600: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e610: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e620: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e630: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e640: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e650: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e660: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e670: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e680: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e690: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e6a0: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e6b0: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e6c0: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e6d0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e6e0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e6f0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e700: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e710: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e720: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e730: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e740: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e750: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e760: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e770: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e780: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e790: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e7a0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e7b0: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e7c0: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e7d0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e7e0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e7f0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e800: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e810: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e820: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e830: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e840: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e850: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e860: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e870: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e880: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e890: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e8a0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e8b0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e8c0: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e8d0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e8e0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e8f0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e900: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e910: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e920: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e930: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e940: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e950: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e960: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e970: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e980: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e990: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e9a0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e9b0: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e9c0: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e9d0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e9e0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e9f0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
ea00: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
ea10: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
ea20: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
ea30: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
ea40: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
ea50: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
ea60: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
ea70: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
ea80: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
ea90: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
eaa0: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
eab0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
eac0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
ead0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
eae0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
eaf0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
eb00: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
eb10: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
eb20: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
eb30: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
eb40: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
eb50: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
eb60: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
eb70: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
eb80: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eb90: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
eba0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
ebb0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ebc0: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
ebd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
ebe0: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
ebf0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ec00: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
ec10: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
ec20: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
ec30: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
ec40: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
ec50: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
ec60: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
ec70: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
ec80: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
ec90: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
eca0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
ecb0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ecc0: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
ecd0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
ece0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
ecf0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ed00: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ed10: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
ed20: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
ed30: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
ed40: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
ed50: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
ed60: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ed70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ed80: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
ed90: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
eda0: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
edb0: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
edc0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
edd0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ede0: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
edf0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
ee00: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
ee10: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
ee20: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ee30: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ee40: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
ee50: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
ee60: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
ee70: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
ee80: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ee90: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
eea0: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
eeb0: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
eec0: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
eed0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
eee0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
eef0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
ef00: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ef10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
ef20: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
ef30: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
ef40: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
ef50: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
ef60: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
ef70: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
ef80: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
ef90: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
efa0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
efb0: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
efc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
efd0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
efe0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
eff0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
f000: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
f010: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
f020: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
f030: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
f040: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
f050: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
f060: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
f070: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
f080: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
f090: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
f0a0: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
f0b0: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
f0c0: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
f0d0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
f0e0: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
f0f0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
f100: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
f110: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
f120: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
f130: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
f140: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
f150: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
f160: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f170: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
f180: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
f190: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
f1a0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
f1b0: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
f1c0: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
f1d0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
f1e0: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
f1f0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
f200: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
f210: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
f220: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
f230: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
f240: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
f250: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
f260: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
f270: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
f280: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
f290: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f2a0: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
f2b0: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
f2c0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f2d0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
f2e0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
f2f0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
f300: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
f310: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
f320: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
f330: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
f340: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
f350: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
f360: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
f370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f380: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
f390: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
f3a0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
f3b0: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
f3c0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
f3d0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
f3e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f3f0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
f400: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
f410: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
f420: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f430: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f440: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f450: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f460: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f470: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f480: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f490: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f4a0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f4b0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f4c0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f4d0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f4e0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f4f0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f500: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f510: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f520: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f530: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f540: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f550: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f560: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f570: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f580: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f590: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f5a0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f5b0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f5c0: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f5d0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f5e0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f5f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f600: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f610: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f620: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f630: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f640: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f650: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f660: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f670: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f680: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f690: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f6a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f6b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f6c0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f6d0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f6e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f6f0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f700: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f710: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f720: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f730: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f740: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f750: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f760: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f770: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f780: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f790: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f7a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f7b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f7c0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f7d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f7f0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f800: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f810: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f830: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f840: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f850: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f860: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f870: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f880: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f890: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f8a0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8c0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f8d0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f8e0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f8f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f920: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f930: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f940: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f950: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f960: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f970: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f990: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f9a0: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f9b0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f9c0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f9d0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f9e0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f9f0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
fa00: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
fa10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
fa20: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
fa30: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
fa40: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
fa50: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
fa60: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
fa70: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
fa80: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
fa90: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
faa0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
fab0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fac0: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
fad0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
fae0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
faf0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
fb00: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
fb10: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
fb20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fb30: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
fb40: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
fb50: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
fb60: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
fb70: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
fb80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fb90: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
fba0: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
fbb0: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
fbc0: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
fbd0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
fbe0: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
fbf0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
fc00: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
fc10: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fc20: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
fc30: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
fc40: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
fc50: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
fc60: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
fc70: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
fc80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
fc90: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
fca0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
fcb0: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
fcc0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
fcd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fcf0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
fd00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
fd10: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
fd20: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fd30: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
fd40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
fd50: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
fd60: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
fd70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fd80: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
fd90: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
fda0: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
fdb0: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
fdc0: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
fdd0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
fde0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fdf0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
fe00: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
fe10: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
fe20: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
fe30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fe40: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fe50: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
fe60: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
fe70: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fe80: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fe90: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
fea0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
feb0: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
fec0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fed0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fee0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fef0: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
ff00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ff10: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
ff20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
ff30: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
ff40: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
ff50: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
ff60: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
ff70: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
ff80: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ffa0: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
ffb0: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
ffc0: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
ffd0: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
ffe0: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
fff0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10000 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
10010 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
10020 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10030 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10040 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
10050 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
10060 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10070 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10080 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10090 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
100a0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
100b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
100c0 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
100d0 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
100e0 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
100f0 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
10100 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
10110 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
10120 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
10130 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
10140 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
10150 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
10160 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
10170 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
10180 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
10190 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
101a0 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
101b0 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
101c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
101d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
101e0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
101f0 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
10200 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
10210 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
10220 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
10230 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
10240 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
10250 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
10260 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
10270 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
10280 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
10290 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
102a0 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
102b0 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
102c0 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
102d0 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
102e0 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
102f0 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10300 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
10310 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
10320 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
10330 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
10340 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
10350 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
10360 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
10370 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
10380 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
10390 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
103a0 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
103b0 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
103c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
103d0 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
103e0 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
103f0 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
10400 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
10410 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
10420 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10430 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10440 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10450 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10460 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10470 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10480 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10490 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
104a0 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
104b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
104c0 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
104d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
104e0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
104f0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10500 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
10510 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10520 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10530 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10540 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10550 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10560 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10570 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10580 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10590 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
105a0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
105b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
105c0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
105d0 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
105e0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
105f0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10600 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10610 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10620 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10630 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10640 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10650 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10660 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10670 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10680 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10690 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
106a0 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
106b0 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
106c0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
106d0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
106e0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
106f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10700 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10710 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10720 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10730 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10740 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10750 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10760 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10770 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10780 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10790 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
107a0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
107b0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
107c0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
107d0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
107e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
107f0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10800 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10810 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10820 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10830 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10840 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10850 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10860 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10870 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
10880 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
10890 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
108a0 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
108b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
108c0 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
108d0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
108e0 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
108f0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10900 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10910 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
10920 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10930 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10940 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10950 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10960 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10970 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10980 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
10990 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
109a0 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
109b0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
109c0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
109d0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
109e0 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
109f0 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
10a00 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10a10 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
10a20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10a30 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10a40 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10a50 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10a60 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10a70 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
10a80 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
10a90 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
10aa0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10ab0 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10ac0 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
10ad0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
10ae0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
10af0 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
10b00 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
10b10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
10b20 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10b30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10b40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10b50 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10b80 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10b90 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10bb0 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10bc0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
10bd0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
10be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bf0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
10c00 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
10c10 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
10c20 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10c40 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10c50 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10c60 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10c90 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10ca0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10cb0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10cc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
10cd0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
10ce0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
10cf0 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
10d00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10d10 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10d20 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10d30 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
10d40 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20  ->jfd).  ){.    
10d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10d60 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10d70 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
10d80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10d90 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
10da0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10db0 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
10dc0 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
10dd0 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
10de0 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
10df0 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10e00 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10e10 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10e20 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10e30 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10e40 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10e50 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10e60 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10e70 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10e80 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10e90 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
10ea0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10eb0 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
10ec0 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
10ed0 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
10ee0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10ef0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10f00 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
10f10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
10f20 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
10f30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10f40 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
10f50 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
10f60 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10f80 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
10f90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
10fa0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
10fb0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
10fc0 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
10fd0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
10fe0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
10ff0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
11000 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
11010 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
11020 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
11030 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
11040 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
11050 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
11060 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
11070 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
11080 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
11090 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
110a0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
110b0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
110c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
110d0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
110e0 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
110f0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11100 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11110 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11120 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
11130 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11140 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
11150 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
11160 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
11170 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d      iHdrOff+4+nM
111a0 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
111b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
111c0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
111d0 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
111e0 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
111f0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11200 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
11210 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
11220 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
11230 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
11240 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
11250 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
11260 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11270 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
11280 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
11290 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
112a0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
112b0 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
112c0 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
112d0 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
112e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
112f0 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
11300 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
11310 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11320 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
11330 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
11340 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
11350 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
11360 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
11370 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
11380 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
11390 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
113a0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
113b0 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
113c0 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
113d0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
113e0 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
113f0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11400 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
11410 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
11420 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
11430 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
11440 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
11450 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
11460 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
11470 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
11480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11490 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
114a0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
114b0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
114c0 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
114d0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
114e0 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
114f0 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69  er){.  pPager->i
11500 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20  DataVersion++;. 
11510 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
11520 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
11530 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65  ackup);.  sqlite
11540 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
11550 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
11560 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11570 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  he pPager->iData
11580 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f  Version value.*/
11590 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65  .u32 sqlite3Page
115a0 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67  rDataVersion(Pag
115b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
115c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
115d0 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
115e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
115f0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11600 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n;.}../*.** Free
11610 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11620 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11630 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11640 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11650 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11660 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11670 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11680 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11690 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
116a0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
116b0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
116c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
116d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
116e0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
116f0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11700 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11720 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11730 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11740 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11750 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11760 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11770 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11780 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11790 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
117a0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
117b0 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
117c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
117d0 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
117e0 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
117f0 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ory(pPager->sjfd
11800 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11810 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11820 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11830 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
11840 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
11850 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
11860 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
11870 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
11880 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
11890 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
118a0 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
118b0 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
118c0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
118d0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
118e0 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
118f0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11900 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11910 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
11920 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
11930 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
11940 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
11950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
11960 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
11970 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
11980 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
11990 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
119a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
119b0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
119c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
119d0 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
119e0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
119f0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11a00 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11a10 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
11a20 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
11a30 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11a40 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
11a50 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
11a60 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
11a70 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
11a80 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
11a90 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
11aa0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
11ab0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
11ac0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
11ad0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
11ae0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11af0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11b00 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
11b10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
11b20 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 49 66 20  URRENT./*.** If 
11b30 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61 6c 72  they are not alr
11b40 65 61 64 79 2c 20 62 65 67 69 6e 20 72 65 63 6f  eady, begin reco
11b50 72 64 69 6e 67 20 61 6c 6c 20 70 61 67 65 73 20  rding all pages 
11b60 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
11b70 67 65 72 20 6c 61 79 65 72 0a 2a 2a 20 62 79 20  ger layer.** by 
11b80 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
11b90 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
11ba0 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e   concurrent tran
11bb0 73 61 63 74 69 6f 6e 73 2e 20 52 65 74 75 72 6e  sactions. Return
11bc0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  .** SQLITE_OK if
11bd0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
11be0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
11bf0 63 6f 64 65 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  code (SQLITE_NOM
11c00 45 4d 29 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  EM) if an error.
11c10 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
11c20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
11c30 67 69 6e 43 6f 6e 63 75 72 72 65 6e 74 28 50 61  ginConcurrent(Pa
11c40 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11c50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11c60 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
11c70 2d 3e 70 41 6c 6c 52 65 61 64 3d 3d 30 20 29 7b  ->pAllRead==0 ){
11c80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
11c90 6c 52 65 61 64 20 3d 20 73 71 6c 69 74 65 33 42  lRead = sqlite3B
11ca0 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
11cb0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
11cc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
11cd0 6c 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lRead==0 ){.    
11ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
11cf0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
11d00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11d10 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
11d20 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
11d30 54 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 70 20 72 65  T).**.** Stop re
11d40 63 6f 72 64 69 6e 67 20 61 6c 6c 20 70 61 67 65  cording all page
11d50 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
11d60 70 61 67 65 72 20 6c 61 79 65 72 20 62 79 20 74  pager layer by t
11d70 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 0a  he b-tree layer.
11d80 2a 2a 20 61 6e 64 20 64 69 73 63 61 72 64 20 61  ** and discard a
11d90 6e 79 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  ny current recor
11da0 64 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ds..*/.void sqli
11db0 74 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63 75  te3PagerEndConcu
11dc0 72 72 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61  rrent(Pager *pPa
11dd0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  ger){.  sqlite3B
11de0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
11df0 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 29 3b 0a  ger->pAllRead);.
11e00 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65    pPager->pAllRe
11e10 61 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 21 64  ad = 0;.}../* !d
11e20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11e30 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
11e40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
11e50 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
11e60 20 69 73 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e   is in wal mode.
11e70 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   False otherwise
11e80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11e90 50 61 67 65 72 49 73 57 61 6c 28 50 61 67 65 72  PagerIsWal(Pager
11ea0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
11eb0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  urn pPager->pWal
11ec0 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  !=0;.}.#endif /*
11ed0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
11ee0 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a  CURRENT */../*.*
11ef0 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65 72  * Free the Pager
11f00 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  .pInJournal and 
11f10 50 61 67 65 72 2e 70 41 6c 6c 52 65 61 64 20 62  Pager.pAllRead b
11f20 69 74 76 65 63 20 6f 62 6a 65 63 74 73 2e 0a 2a  itvec objects..*
11f30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
11f40 67 65 72 46 72 65 65 42 69 74 76 65 63 73 28 50  gerFreeBitvecs(P
11f50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11f60 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
11f70 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
11f80 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
11f90 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
11fa0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  = 0;.  sqlite3Pa
11fb0 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74  gerEndConcurrent
11fc0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
11fd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11fe0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
11ff0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
12000 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
12010 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
12020 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
12030 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
12040 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
12050 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
12060 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
12070 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
12080 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
12090 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
120a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
120b0 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
120c0 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
120d0 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
120e0 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
120f0 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
12100 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
12110 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
12120 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
12130 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
12140 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
12150 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
12160 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
12170 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
12180 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
12190 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
121a0 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
121b0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
121c0 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
121d0 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
121e0 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
121f0 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
12200 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
12210 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
12220 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
12230 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
12240 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
12250 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
12260 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
12270 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
12280 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
12290 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
122a0 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
122b0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
122c0 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
122d0 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
122e0 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
122f0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
12300 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
12310 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
12320 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
12330 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
12340 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
12350 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12360 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
12370 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
12380 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
12390 20 29 3b 0a 0a 20 20 70 61 67 65 72 46 72 65 65   );..  pagerFree
123a0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 29 3b  Bitvecs(pPager);
123b0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
123c0 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
123d0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
123e0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
123f0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
12400 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
12410 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
12420 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
12430 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
12440 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
12450 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12460 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
12470 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
12480 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
12490 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
124a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
124b0 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
124c0 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
124d0 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
124e0 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
124f0 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
12500 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
12510 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
12520 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
12530 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
12540 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
12550 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
12560 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
12570 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
12580 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
12590 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
125a0 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
125b0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
125c0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
125d0 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
125e0 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
125f0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
12600 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
12610 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
12620 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12630 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12640 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
12650 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12660 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12670 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
12680 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12690 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
126a0 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
126b0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
126c0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
126d0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
126e0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
126f0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12700 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
12710 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
12720 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12730 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
12740 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
12750 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
12760 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
12770 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
12780 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
12790 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
127a0 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
127b0 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
127c0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
127d0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
127e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
127f0 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
12800 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
12810 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
12820 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
12830 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
12840 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
12850 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
12860 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
12870 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
12880 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
12890 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
128a0 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
128b0 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
128c0 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
128d0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
128e0 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
128f0 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
12900 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
12910 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
12920 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12930 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
12940 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
12950 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
12960 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
12970 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
12980 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
12990 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
129a0 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
129b0 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
129c0 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
129d0 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
129e0 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
129f0 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
12a00 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
12a10 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
12a20 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
12a30 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
12a40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12a50 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
12a60 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
12a70 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
12a80 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
12a90 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
12aa0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12ab0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12ac0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
12ad0 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12ae0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
12af0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12b00 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
12b10 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
12b20 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
12b30 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
12b40 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
12b50 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
12b60 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
12b70 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
12b80 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
12b90 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
12ba0 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
12bb0 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12bc0 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
12bd0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12be0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
12bf0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
12c00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12c10 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
12c20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
12c30 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
12c40 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
12c50 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12c60 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
12c70 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
12c80 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12c90 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EN;.    }else{. 
12ca0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
12cb0 61 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50  ate = (isOpen(pP
12cc0 61 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47  ager->jfd) ? PAG
12cd0 45 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f  ER_OPEN : PAGER_
12ce0 52 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20  READER);.    }. 
12cf0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
12d00 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
12d10 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
12d20 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
12d30 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12d40 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
12d50 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
12d60 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
12d70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
12d80 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  dr = 0;.  pPager
12d90 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
12da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
12db0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
12dc0 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f  d whenever an IO
12dd0 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f  ERR or FULL erro
12de0 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a  r that requires.
12df0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
12e00 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20  transition into 
12e10 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
12e20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65  may ahve occurre
12e30 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  d..** The first 
12e40 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
12e50 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
12e60 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  er structure, th
12e70 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65  e second .** the
12e80 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75   error-code abou
12e90 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
12ea0 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20   by a pager API 
12eb0 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a  function. The .*
12ec0 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * value returned
12ed0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
12ee0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12ef0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
12f00 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
12f10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12f20 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  t is SQLITE_FULL
12f30 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  , SQLITE_IOERR o
12f40 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  r one of the.** 
12f50 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c  IOERR sub-codes,
12f60 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72   the pager enter
12f70 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  s the ERROR stat
12f80 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  e and the error 
12f90 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65  code.** is store
12fa0 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  d in Pager.errCo
12fb0 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61  de. While the pa
12fc0 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74  ger remains in t
12fd0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a  he ERROR state,.
12fe0 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49  ** all major API
12ff0 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61   calls on the Pa
13000 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  ger will immedia
13010 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65  tely return Page
13020 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a  r.errCode..**.**
13030 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   The ERROR state
13040 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
13050 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
13060 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
13070 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
13080 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
13090 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
130a0 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
130b0 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
130c0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
130d0 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
130e0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
130f0 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
13100 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
13110 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  t error occurred
13120 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
13130 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
13140 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
13150 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72  played to restor
13160 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
13170 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
13180 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74  ile (as if.** it
13190 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72   were a hot-jour
131a0 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nal)..*/.static 
131b0 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
131c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
131d0 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
131e0 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
131f0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
13200 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
13210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20   );.  assert(.  
13220 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
13230 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
13240 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
13250 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
13260 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
13270 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
13280 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
13290 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
132a0 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46  f( rc2==SQLITE_F
132b0 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49  ULL || rc2==SQLI
132c0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
132d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
132e0 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  = rc;.    pPager
132f0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
13300 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
13310 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
13320 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
13330 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
13340 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
13350 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 72 69  ;../*.** The wri
13360 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
13370 70 65 6e 20 6f 6e 20 70 50 61 67 65 72 20 69 73  pen on pPager is
13380 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
13390 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a 2a 2a   (bCommit==1).**
133a0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
133b0 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a 2a 2a  (bCommit==0)..**
133c0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
133d0 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61  if and only if a
133e0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 73  ll dirty pages s
133f0 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68 65 64  hould be flushed
13400 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
13410 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  Rules:.**.**   *
13420 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50 20 64    For non-TEMP d
13430 61 74 61 62 61 73 65 73 2c 20 61 6c 77 61 79 73  atabases, always
13440 20 73 79 6e 63 20 74 6f 20 64 69 73 6b 2e 20 20   sync to disk.  
13450 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
13460 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72 20 74 72  y.**      for tr
13470 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f 20 62 65  ansactions to be
13480 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20   durable..**.** 
13490 20 20 2a 20 20 53 79 6e 63 20 54 45 4d 50 20 64    *  Sync TEMP d
134a0 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 6f 6e 20  atabase only on 
134b0 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74 20 61 20  a COMMIT (not a 
134c0 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65 6e 20 74  ROLLBACK) when t
134d0 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a 20 20 20  he backing.**   
134e0 20 20 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e     file has been
134f0 20 63 72 65 61 74 65 64 20 61 6c 72 65 61 64 79   created already
13500 20 28 76 69 61 20 61 20 73 70 69 6c 6c 20 6f 6e   (via a spill on
13510 20 70 61 67 65 72 53 74 72 65 73 73 28 29 29 20   pagerStress()) 
13520 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77 68 65 6e  and.**      when
13530 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
13540 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 6d 65  irty pages in me
13550 6d 6f 72 79 20 65 78 63 65 65 64 73 20 32 35 25  mory exceeds 25%
13560 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 0a 2a 2a   of the total.**
13570 20 20 20 20 20 20 63 61 63 68 65 20 73 69 7a 65        cache size
13580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13590 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d  pagerFlushOnComm
135a0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
135b0 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
135c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
135d0 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75  mpFile==0 ) retu
135e0 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 62 43 6f  rn 1;.  if( !bCo
135f0 6d 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  mmit ) return 0;
13600 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
13610 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74  Pager->fd) ) ret
13620 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
13630 28 73 71 6c 69 74 65 33 50 43 61 63 68 65 50 65  (sqlite3PCachePe
13640 72 63 65 6e 74 44 69 72 74 79 28 70 50 61 67 65  rcentDirty(pPage
13650 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32 35 29  r->pPCache)>=25)
13660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
13670 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
13680 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
13690 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
136a0 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
136b0 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
136c0 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
136d0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
136e0 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
136f0 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
13700 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
13710 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
13720 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13730 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
13740 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
13750 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
13760 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
13770 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
13780 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
13790 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
137a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
137b0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
137c0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
137d0 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
137e0 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
137f0 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
13800 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
13810 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
13820 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
13830 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
13840 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
13850 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
13860 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
13870 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
13880 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
13890 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
138a0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
138b0 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
138c0 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
138d0 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
138e0 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
138f0 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
13900 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
13910 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
13920 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
13930 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
13940 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
13950 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
13960 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
13970 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
13980 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
13990 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
139a0 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
139b0 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
139c0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
139d0 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
139e0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
139f0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
13a00 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
13a10 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
13a20 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
13a30 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
13a40 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
13a50 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
13a60 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
13a70 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
13a80 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
13a90 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
13aa0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
13ab0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13ac0 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
13ad0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
13ae0 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
13af0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
13b00 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
13b10 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
13b20 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
13b30 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
13b40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13b50 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
13b60 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13b70 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13b80 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13b90 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13ba0 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13bb0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13bc0 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13bd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13be0 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
13bf0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
13c00 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
13c10 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
13c20 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
13c30 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
13c40 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
13c50 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
13c60 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13c70 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13c80 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13c90 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13ca0 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13cb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13cc0 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13cd0 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13ce0 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
13cf0 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
13d00 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
13d10 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
13d20 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
13d30 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
13d40 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
13d50 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
13d60 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
13d70 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
13d80 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
13d90 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
13da0 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
13db0 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
13dc0 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
13dd0 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
13de0 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
13df0 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
13e00 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
13e10 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
13e20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
13e30 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
13e40 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
13e50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13e60 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
13e70 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
13e80 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13e90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13ea0 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
13eb0 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
13ec0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
13ed0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
13ee0 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
13ef0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
13f00 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
13f10 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
13f20 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
13f30 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
13f40 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
13f50 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
13f60 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13f70 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13f80 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13f90 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13fa0 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13fb0 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13fc0 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13fd0 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13fe0 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
13ff0 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
14000 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
14010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14020 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
14030 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
14040 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
14050 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
14060 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14070 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
14080 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
14090 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
140a0 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
140b0 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
140c0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
140d0 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
140e0 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
140f0 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
14100 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
14110 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
14120 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
14130 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
14140 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
14150 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
14160 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
14170 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
14180 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
14190 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
141a0 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
141b0 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
141c0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
141d0 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
141e0 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
141f0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
14200 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
14210 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
14220 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
14230 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
14240 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
14250 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
14260 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
14270 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
14280 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
14290 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
142a0 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
142b0 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
142c0 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
142d0 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
142e0 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
142f0 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
14300 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
14310 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
14320 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
14330 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
14340 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
14350 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
14360 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
14370 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
14380 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
14390 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
143a0 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
143b0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
143c0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
143d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
143e0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
143f0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
14400 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14410 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
14420 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
14430 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
14440 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
14450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14460 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
14470 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
14480 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
14490 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
144a0 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
144b0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
144c0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
144d0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
144e0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
144f0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
14500 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
14510 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
14520 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
14530 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
14540 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ory(pPager->jfd)
14550 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   ){.      /* ass
14560 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
14570 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14580 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
14590 52 59 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73  RY ); */.      s
145a0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
145b0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
145c0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
145d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
145e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
145f0 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
14600 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
14610 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
14620 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14630 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
14640 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
14650 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
14660 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
14670 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
14680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14690 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  & pPager->fullSy
146a0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
146b0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
146c0 20 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69   new file size i
146d0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
146e0 68 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61  he inode right a
146f0 77 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  way..          *
14700 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  * Otherwise the 
14710 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65  journal might re
14720 73 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e  surrect followin
14730 67 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61  g a power loss a
14740 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
14750 63 61 75 73 65 20 74 68 65 20 6c 61 73 74 20 74  cause the last t
14760 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f  ransaction to ro
14770 6c 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20  ll back.  See.  
14780 20 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73          ** https
14790 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69  ://bugzilla.mozi
147a0 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67  lla.org/show_bug
147b0 2e 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a  .cgi?id=1072773.
147c0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
147d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
147e0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
147f0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
14800 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  yncFlags);.     
14810 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14820 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
14830 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
14840 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
14850 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14860 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14870 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c  PERSIST.      ||
14880 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
14890 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
148a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
148b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
148c0 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20  E_WAL).    ){.  
148d0 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75      rc = zeroJou
148e0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
148f0 68 61 73 4d 61 73 74 65 72 7c 7c 70 50 61 67 65  hasMaster||pPage
14900 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
14910 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
14920 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
14930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
14940 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20  This branch may 
14950 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68  be executed with
14960 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
14970 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20  de==MEMORY if.  
14980 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75      ** a hot-jou
14990 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f  rnal was just ro
149a0 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68  lled back. In th
149b0 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
149c0 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  nal.      ** fil
149d0 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  e should be clos
149e0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20  ed and deleted. 
149f0 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  If this connecti
14a00 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20  on writes to.   
14a10 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
14a20 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c  se file, it will
14a30 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20   do so using an 
14a40 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
14a50 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
14a60 20 20 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20    int bDelete = 
14a70 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
14a80 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
14a90 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49   sqlite3JournalI
14aa0 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
14ab0 2d 3e 6a 66 64 29 3d 3d 30 20 29 3b 0a 20 20 20  ->jfd)==0 );.   
14ac0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14ad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
14ae0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14af0 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20  E_DELETE .      
14b00 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14b10 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14b20 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
14b30 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20  EMORY .         
14b40 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
14b50 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14b60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
14b70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
14b80 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
14b90 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
14ba0 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20 29     if( bDelete )
14bb0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14bc0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
14bd0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
14be0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
14bf0 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
14c00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14c10 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
14c20 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14c30 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
14c40 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
14c50 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
14c60 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
14c70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14c80 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c  dbSize==0 && sql
14c90 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
14ca0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
14cb0 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  he)>0 ){.    PgH
14cc0 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50  dr *p = sqlite3P
14cd0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
14ce0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
14cf0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
14d00 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
14d10 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
14d20 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20  efNotNull(p);.  
14d30 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14d40 20 20 70 61 67 65 72 46 72 65 65 42 69 74 76 65    pagerFreeBitve
14d50 63 73 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  cs(pPager);.  pP
14d60 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
14d70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14d80 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
14d90 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69  agerFlushOnCommi
14da0 74 28 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69  t(pPager, bCommi
14db0 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
14dc0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
14dd0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
14de0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
14df0 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
14e00 68 65 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28  heClearWritable(
14e10 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
14e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14e30 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74  te3PcacheTruncat
14e40 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
14e50 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e, pPager->dbSiz
14e60 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  e);.  }..  if( p
14e70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
14e80 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f  r) ){.    /* Dro
14e90 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d  p the WAL write-
14ea0 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c  lock, if any. Al
14eb0 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65  so, if the conne
14ec0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20  ction was in .  
14ed0 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64    ** locking_mod
14ee0 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
14ef0 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   but is no longe
14f00 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c  r, drop the EXCL
14f10 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f  USIVE .    ** lo
14f20 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  ck held on the d
14f30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
14f40 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73    */.    rc2 = s
14f50 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74  qlite3WalEndWrit
14f60 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
14f70 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
14f80 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c  assert( rc2==SQL
14f90 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73  ITE_OK );.  }els
14fa0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
14fb0 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
14fc0 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  & pPager->dbFile
14fd0 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53  Size>pPager->dbS
14fe0 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ize ){.    /* Th
14ff0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
15000 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  en when committi
15010 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
15020 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75   in rollback-jou
15030 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  rnal.    ** mode
15040 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
15050 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
15060 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
15070 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
15080 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20  .    ** At this 
15090 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  point the journa
150a0 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  l has been final
150b0 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61  ized and the tra
150c0 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  nsaction .    **
150d0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
150e0 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65  mmitted, but the
150f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
15100 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e  is still held on
15110 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65   the.    ** file
15120 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20  . So it is safe 
15130 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
15140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
15150 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   its minimum.   
15160 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a   ** required siz
15170 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
15180 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
15190 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
151a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
151b0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
151c0 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
151d0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ze);.  }..  if( 
151e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
151f0 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70   bCommit && isOp
15200 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
15210 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15220 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
15230 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
15240 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f  TE_FCNTL_COMMIT_
15250 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20  PHASETWO, 0);.  
15260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15270 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d  _NOTFOUND ) rc =
15280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15290 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
152a0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
152b0 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57    && (!pagerUseW
152c0 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71  al(pPager) || sq
152d0 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
152e0 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
152f0 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20  al, 0)).  ){.   
15300 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f   rc2 = pagerUnlo
15310 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
15320 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
15330 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
15340 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ntDone = 0;.  }.
15350 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
15360 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
15370 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
15380 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74  ster = 0;..  ret
15390 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
153a0 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
153b0 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
153c0 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
153d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
153e0 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
153f0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
15400 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
15410 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
15420 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
15430 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f   ERROR state, do
15440 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
15450 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
15460 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
15470 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
15480 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
15490 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
154a0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
154b0 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
154c0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
154d0 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
154e0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
154f0 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61  ove the pager ba
15500 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
15510 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65  . If this .** me
15520 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ans that there i
15530 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
15540 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
15550 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78  -system, the nex
15560 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  t .** connection
15570 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
15580 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
15590 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
155a0 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a   be this one) .*
155b0 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62  * will roll it b
155c0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
155d0 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
155e0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
155f0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
15600 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
15610 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
15620 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
15630 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
15640 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
15650 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
15660 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
15670 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63  RROR state. Whic
15680 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
15690 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
156a0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
156b0 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
156c0 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
156d0 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
156e0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
156f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
15700 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
15710 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
15720 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
15730 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e!=PAGER_OPEN ){
15740 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
15750 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
15760 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69  pPager) );.    i
15770 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
15780 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
15790 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
157a0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
157b0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
157c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
157d0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
157e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
157f0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
15800 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
15810 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
15820 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Mode ){.      as
15830 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15840 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
15850 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ER );.      page
15860 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
15870 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b  n(pPager, 0, 0);
15880 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
15890 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
158a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
158b0 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
158c0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
158d0 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
158e0 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
158f0 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
15900 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
15910 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
15920 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
15930 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
15940 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
15950 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
15960 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
15970 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
15980 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
15990 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
159a0 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
159b0 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
159c0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
159d0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
159e0 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
159f0 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
15a00 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
15a10 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
15a20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
15a30 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
15a40 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
15a50 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
15a60 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
15a70 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
15a80 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
15a90 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
15aa0 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
15ab0 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
15ac0 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
15ad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
15ae0 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
15af0 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
15b00 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
15b10 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
15b20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
15b30 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
15b40 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
15b50 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
15b60 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
15b70 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
15b80 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
15b90 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
15ba0 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
15bb0 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
15bc0 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
15bd0 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
15be0 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
15bf0 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
15c00 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
15c10 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
15c20 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
15c30 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
15c40 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
15c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
15c60 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
15c70 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
15c80 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
15c90 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
15ca0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
15cb0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
15cc0 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
15cd0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
15ce0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
15cf0 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
15d00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
15d10 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
15d20 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
15d30 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
15d40 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
15d50 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
15d60 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
15d70 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
15d80 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
15d90 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
15da0 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
15db0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
15dc0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
15dd0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
15de0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
15df0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
15e00 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
15e10 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
15e20 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
15e30 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
15e40 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
15e50 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e70 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
15e80 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
15e90 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
15ea0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
15eb0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
15ec0 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
15ed0 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
15ee0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
15ef0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f  LITE_HAS_CODEC./
15f00 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
15f10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
15f20 65 72 76 65 64 20 62 69 74 73 20 69 73 20 74 68  erved bits is th
15f30 65 20 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65  e same in the de
15f40 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67  stination.** pag
15f50 65 72 20 61 73 20 69 74 20 69 73 20 69 6e 20 74  er as it is in t
15f60 68 65 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73  he source.  This
15f70 20 63 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61   comes up when a
15f80 20 56 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20   VACUUM changes 
15f90 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
15fa0 20 72 65 73 65 72 76 65 64 20 62 69 74 73 20 74   reserved bits t
15fb0 6f 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20  o the "optimal" 
15fc0 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  amount..*/.void 
15fd0 73 71 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67  sqlite3PagerAlig
15fe0 6e 52 65 73 65 72 76 65 28 50 61 67 65 72 20 2a  nReserve(Pager *
15ff0 70 44 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53  pDest, Pager *pS
16000 72 63 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74  rc){.  if( pDest
16010 2d 3e 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63  ->nReserve!=pSrc
16020 2d 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20  ->nReserve ){.  
16030 20 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76    pDest->nReserv
16040 65 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72  e = pSrc->nReser
16050 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
16060 6f 72 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a  ortSize(pDest);.
16070 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
16080 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
16090 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
160a0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
160b0 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
160c0 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
160d0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
160e0 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
160f0 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
16100 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
16110 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
16120 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
16130 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
16140 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
16150 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
16160 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
16170 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
16180 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
16190 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  l..**.** The mai
161a0 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
161b0 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d  al uses checksum
161c0 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
161d0 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a  t journal does .
161e0 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ** not..**.** If
161f0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16200 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
16210 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
16220 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
16230 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
16240 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
16250 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
16260 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
16270 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
16280 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
16290 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
162a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
162b0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
162c0 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
162d0 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
162e0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
162f0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
16300 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
16310 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
16320 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
16330 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
16340 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
16350 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
16360 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
16370 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
16380 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
16390 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
163a0 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
163b0 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
163c0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
163d0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
163e0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
163f0 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
16400 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
16410 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
16420 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
16430 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
16440 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
16450 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
16460 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
16470 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
16480 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
16490 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
164a0 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
164b0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
164c0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
164d0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
164e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
164f0 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
16500 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
16510 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
16520 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
16530 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
16540 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
16550 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
16560 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
16570 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
16580 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
16590 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
165a0 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
165b0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
165c0 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
165d0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
165e0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
165f0 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
16600 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
16610 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
16620 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
16630 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
16640 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
16650 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
16660 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
16670 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
16680 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
16690 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
166a0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
166b0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
166c0 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
166d0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
166e0 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
166f0 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
16700 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
16710 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
16720 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
16730 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
16740 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
16750 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
16760 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
16770 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16780 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
16790 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
167a0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
167b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
167c0 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
167d0 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
167e0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
167f0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
16800 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
16810 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
16820 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
16830 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
16840 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
16850 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
16860 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
16870 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
16880 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
16890 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
168a0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
168b0 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
168d0 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
168e0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
168f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
16900 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16920 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
16930 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
16940 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16960 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
16970 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
16980 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
16990 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
169b0 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
169c0 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
169d0 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
169e0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
169f0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
16a00 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
16a10 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
16a20 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
16a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16a40 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16a50 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
16a60 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
16a70 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
16a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
16a90 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
16aa0 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
16ab0 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
16ac0 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
16ad0 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
16ae0 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
16af0 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
16b00 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
16b10 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
16b20 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
16b30 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
16b40 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
16b50 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
16b60 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
16b70 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
16b80 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
16b90 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
16ba0 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
16bb0 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
16bc0 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
16bd0 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
16be0 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
16bf0 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
16c00 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
16c10 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
16c20 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
16c30 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
16c40 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16c50 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
16c60 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
16c70 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
16c80 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
16c90 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
16ca0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
16cb0 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
16cc0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
16cd0 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
16ce0 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
16cf0 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
16d00 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
16d10 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
16d20 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
16d30 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
16d40 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
16d50 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
16d60 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
16d70 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
16d80 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
16d90 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
16da0 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
16db0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
16dc0 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
16dd0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
16de0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16df0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16e00 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
16e10 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
16e20 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
16e30 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
16e40 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
16e50 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
16e60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
16e70 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
16e80 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
16e90 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
16ea0 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
16eb0 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
16ec0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
16ed0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
16ee0 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
16ef0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
16f00 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
16f10 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
16f20 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
16f30 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
16f40 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
16f50 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
16f60 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
16f70 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
16f80 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
16f90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16fa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
16fb0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16fc0 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
16fd0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16fe0 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
16ff0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17000 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17010 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
17020 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17030 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
17040 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
17050 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
17060 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
17070 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
17080 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
17090 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
170a0 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
170b0 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
170c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
170d0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
170e0 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
170f0 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
17100 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
17110 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
17120 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
17130 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
17140 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
17150 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
17160 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
17170 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
17180 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
17190 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
171a0 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
171b0 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
171c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
171d0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
171e0 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
171f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
17200 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
17210 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
17220 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17230 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
17240 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
17250 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
17260 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
17270 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
17280 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
17290 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
172a0 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
172b0 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
172c0 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
172d0 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
172e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
172f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17300 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
17310 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
17320 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f  played back befo
17330 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  re during the cu
17340 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62  rrent.  ** rollb
17350 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20  ack, then don't 
17360 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69  bother to play i
17370 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20  t back again..  
17380 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  */.  if( pDone &
17390 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
173a0 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
173b0 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
173c0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
173d0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  rc;.  }..  /* Wh
173e0 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  en playing back 
173f0 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20  page 1, restore 
17400 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74  the nReserve set
17410 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ting.  */.  if( 
17420 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65  pgno==1 && pPage
17430 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75  r->nReserve!=((u
17440 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b  8*)aData)[20] ){
17450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
17460 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44  serve = ((u8*)aD
17470 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61  ata)[20];.    pa
17480 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
17490 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
174a0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
174b0 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61   in CACHEMOD sta
174c0 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
174d0 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
174e0 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
174f0 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
17500 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
17510 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
17520 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
17530 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
17540 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
17550 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
17560 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
17570 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
17580 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
17590 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
175a0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
175b0 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
175c0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
175d0 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
175e0 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
175f0 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
17600 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
17610 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
17620 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
17630 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
17640 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
17650 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
17660 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
17670 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
17680 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
17690 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
176a0 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
176b0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
176c0 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
176d0 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
176e0 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
176f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
17700 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57   WRITER_DBMOD, W
17710 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f  RITER_FINISHED o
17720 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
17730 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
17740 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68  .  ** pager cach
17750 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61  e if it exists a
17760 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
17770 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
17780 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20  en marked .  ** 
17790 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65  not dirty. Since
177a0 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e   this code is on
177b0 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50  ly executed in P
177c0 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
177d0 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a  for.  ** a hot-j
177e0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
177f0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
17800 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
17810 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20  cache is empty. 
17820 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72   ** if the pager
17830 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74   is in OPEN stat
17840 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  e..  **.  ** Tic
17850 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
17860 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
17870 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
17880 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
17890 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
178a0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
178b0 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
178c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
178d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
178e0 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
178f0 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
17900 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
17910 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
17920 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
17930 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
17940 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
17950 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
17960 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
17970 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
17980 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
17990 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
179a0 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
179b0 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
179c0 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
179d0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
179e0 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
179f0 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
17a00 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
17a10 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
17a20 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
17a30 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
17a40 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
17a50 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
17a60 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
17a70 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
17a80 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
17a90 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
17aa0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
17ab0 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
17ac0 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
17ad0 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
17ae0 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
17af0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
17b00 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
17b10 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
17b20 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
17b30 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
17b40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
17b50 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
17b60 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
17b70 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
17b80 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
17b90 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
17ba0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
17bb0 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
17bc0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
17bd0 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
17be0 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
17bf0 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
17c00 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
17c10 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
17c20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
17c30 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
17c40 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
17c50 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
17c60 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
17c70 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
17c80 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
17c90 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
17ca0 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
17cb0 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
17cc0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
17cd0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
17ce0 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
17cf0 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  {.    pPg = sqli
17d00 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
17d10 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
17d20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20  }.  assert( pPg 
17d30 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
17d40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
17d50 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
17d60 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20 70  N || pPg==0 || p
17d70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
17d80 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
17d90 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
17da0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
17db0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
17dc0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
17dd0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
17de0 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
17df0 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
17e00 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20  aData),.        
17e10 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
17e20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
17e30 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
17e40 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  );.  if( isMainJ
17e50 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e  rnl ){.    isSyn
17e60 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ced = pPager->no
17e70 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65  Sync || (*pOffse
17e80 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t <= pPager->jou
17e90 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73  rnalHdr);.  }els
17ea0 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  e{.    isSynced 
17eb0 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  = (pPg==0 || 0==
17ec0 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
17ed0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b  HDR_NEED_SYNC));
17ee0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
17ef0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
17f00 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
17f10 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
17f20 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
17f30 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
17f40 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53  _OPEN).   && isS
17f50 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69  ynced.  ){.    i
17f60 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
17f70 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
17f80 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65  pageSize;.    te
17f90 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70  stcase( !isSavep
17fa0 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20  nt && pPg!=0 && 
17fb0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
17fc0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
17fd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
17fe0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
17ff0 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
18000 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
18010 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a  Pager->fd, (u8 *
18020 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
18030 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
18040 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
18050 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
18060 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
18070 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
18080 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
18090 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
180a0 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
180b0 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
180c0 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
180d0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
180e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
180f0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
18100 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
18110 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
18120 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
18130 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18140 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
18150 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61  OMEM_BKPT, aData
18160 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
18170 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
18180 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
18190 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
181a0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
181b0 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
181c0 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
181d0 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
181e0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
181f0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
18200 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
18210 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
18220 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
18230 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
18240 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
18250 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
18260 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
18270 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
18280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
18290 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
182a0 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
182b0 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
182c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
182d0 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
182e0 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
182f0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
18300 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
18310 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
18320 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
18330 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
18340 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
18350 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
18360 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
18370 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
18380 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
18390 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
183a0 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
183b0 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
183c0 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
183d0 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
183e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
183f0 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
18400 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
18410 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
18420 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
18430 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
18440 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
18450 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
18460 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
18470 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
18480 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
18490 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
184a0 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
184b0 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
184c0 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
184d0 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
184e0 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
184f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
18500 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
18510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
18520 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18530 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
18540 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20  LLBACK)==0 );.  
18550 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
18560 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
18570 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
18580 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18590 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  rGet(pPager, pgn
185a0 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20  o, &pPg, 1);.   
185b0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
185c0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
185d0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
185e0 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)!=0 );.    pPa
185f0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
18600 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  &= ~SPILLFLAG_RO
18610 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20  LLBACK;.    if( 
18620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18630 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73  return rc;.    s
18640 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
18650 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
18660 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
18670 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
18680 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
18690 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
186a0 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
186b0 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
186c0 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
186d0 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
186e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
186f0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
18700 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
18710 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
18720 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
18730 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
18740 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
18750 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
18760 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
18770 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
18780 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
18790 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
187a0 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
187b0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
187c0 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
187d0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
187e0 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29  cpy(pData, (u8*)
187f0 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
18800 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  ageSize);.    pP
18810 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
18820 70 50 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20  pPg);.    /* It 
18830 75 73 65 64 20 74 6f 20 62 65 20 74 68 61 74 20  used to be that 
18840 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
18850 65 43 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20  eClean(pPg) was 
18860 63 61 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75  called here.  Bu
18870 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61  t.    ** that ca
18880 6c 6c 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73  ll was dangerous
18890 20 61 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65   and had no dete
188a0 63 74 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73  ctable benefit s
188b0 69 6e 63 65 20 74 68 65 20 63 61 63 68 65 0a 20  ince the cache. 
188c0 20 20 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c     ** is normall
188d0 79 20 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c  y cleaned by sql
188e0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
188f0 6c 6c 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62  ll() after rollb
18900 61 63 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a  ack and so.    *
18910 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
18920 65 64 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  ed. */.    pager
18930 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
18940 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  g);..    /* If t
18950 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
18960 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
18970 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
18980 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
18990 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
189a0 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
189b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
189c0 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
189d0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
189e0 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
189f0 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
18a00 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
18a10 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
18a20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
18a30 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
18a40 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
18a50 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
18a60 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
18a70 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
18a80 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 73  MEM_BKPT);.    s
18a90 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
18aa0 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
18ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18ac0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
18ad0 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
18ae0 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
18af0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
18b00 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
18b10 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
18b20 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
18b30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
18b40 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
18b50 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
18b60 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
18b70 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
18b80 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
18b90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18ba0 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
18bb0 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
18bc0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
18bd0 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
18be0 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
18bf0 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
18c00 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
18c10 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
18c20 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
18c30 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ion..**.** When 
18c40 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
18c50 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
18c60 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65  , it is populate
18c70 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73  d with the names
18c80 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69   .** of all of i
18c90 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ts child journal
18ca0 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f  s, one after ano
18cb0 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20  ther, formatted 
18cc0 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63  as utf-8 .** enc
18cd0 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65  oded text. The e
18ce0 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64  nd of each child
18cf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
18d00 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a   marked with a .
18d10 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
18d20 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69  r byte (0x00). i
18d30 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63  .e. the entire c
18d40 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73  ontents of a mas
18d50 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  ter journal.** f
18d60 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61  ile for a transa
18d70 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20  ction involving 
18d80 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69  two databases mi
18d90 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ght be:.**.**   
18da0 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62  "/home/bill/a.db
18db0 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d  -journal\x00/hom
18dc0 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72  e/bill/b.db-jour
18dd0 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41  nal\x00".**.** A
18de0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18df0 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  file may only be
18e00 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c   deleted once al
18e10 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a  l of its child .
18e20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65  ** journals have
18e30 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
18e40 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
18e50 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65  nction reads the
18e60 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18e70 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
18e80 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65  file into .** me
18e90 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74  mory and loops t
18ea0 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74  hrough each of t
18eb0 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
18ec0 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65   names. For.** e
18ed0 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
18ee0 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a  l, it checks if:
18ef0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68  .**.**   * if th
18f00 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
18f10 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73  exists, and if s
18f20 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  o.**   * if the 
18f30 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f  child journal co
18f40 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e  ntains a referen
18f50 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ce to master jou
18f60 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c  rnal .**     fil
18f70 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  e zMaster.**.** 
18f80 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e  If a child journ
18f90 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  al can be found 
18fa0 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74  that matches bot
18fb0 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69  h of the criteri
18fc0 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73  a.** above, this
18fd0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
18fe0 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  s without doing 
18ff0 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77  anything. Otherw
19000 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75  ise, if.** no su
19010 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
19020 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66   can be found, f
19030 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64  ile zMaster is d
19040 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  eleted from.** t
19050 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75  he file-system u
19060 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
19070 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  lete()..**.** If
19080 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74   an IO error wit
19090 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
190a0 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  n, an error code
190b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
190c0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
190d0 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20  llocates memory 
190e0 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
190f0 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61  e3Malloc(). If a
19100 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  n allocation.** 
19110 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
19120 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
19130 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
19140 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65  o IO or malloc e
19150 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c  rrors .** occur,
19160 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
19170 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  turned..**.** TO
19180 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  DO: This functio
19190 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69  n allocates a si
191a0 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65  ngle block of me
191b0 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  mory to load.** 
191c0 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
191d0 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
191e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
191f0 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  This could be.**
19200 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c   a couple of kil
19210 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70  obytes or so - p
19220 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65  otentially large
19230 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20  r than the page 
19240 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  .** size..*/.sta
19250 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
19260 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
19270 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
19280 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
19290 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
192a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
192b0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
192d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
192e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
192f0 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61  Master;    /* Ma
19300 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f  lloc'd master-jo
19310 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
19320 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
19330 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
19340 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  l;   /* Malloc'd
19350 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66   child-journal f
19360 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
19370 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
19380 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
19390 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
193a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
193b0 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
193c0 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
193d0 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
193e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
193f0 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
19400 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  al;           /*
19410 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20   Pointer to one 
19420 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d  journal within M
19430 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  J file */.  char
19440 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20   *zMasterPtr;   
19450 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74        /* Space t
19460 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61  o hold MJ filena
19470 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61  me from a journa
19480 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
19490 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  nMasterPtr;     
194a0 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20        /* Amount 
194b0 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
194c0 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72  ed to zMasterPtr
194d0 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  [] */..  /* Allo
194e0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
194f0 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
19500 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
19510 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
19520 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
19530 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
19540 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19550 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
19560 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
19570 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
19580 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
19590 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
195a0 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
195b0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
195c0 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
195d0 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
195e0 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
195f0 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
19600 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
19610 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
19620 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
19630 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
19640 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
19650 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
19660 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  NAL);.    rc = s
19670 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
19680 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
19690 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ter, flags, 0);.
196a0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
196b0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
196c0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
196d0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
196e0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
196f0 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
19700 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
19710 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  .  ** sqlite3_ma
19720 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
19730 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
19740 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20  Journal.   Also 
19750 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66  obtain.  ** suff
19760 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e  icient space (in
19770 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20   zMasterPtr) to 
19780 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f  hold the names o
19790 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f  f master.  ** jo
197a0 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72  urnal files extr
197b0 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c  acted from regul
197c0 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  ar rollback-jour
197d0 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  nals..  */.  rc 
197e0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
197f0 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d  ize(pMaster, &nM
19800 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
19810 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19820 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
19830 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74  ter_out;.  nMast
19840 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78  erPtr = pVfs->mx
19850 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d  Pathname+1;.  zM
19860 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73  asterJournal = s
19870 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61  qlite3Malloc(nMa
19880 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
19890 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20  asterPtr + 1);. 
198a0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
198b0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  rnal ){.    rc =
198c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
198d0 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c  PT;.    goto del
198e0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a  master_out;.  }.
198f0 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26    zMasterPtr = &
19900 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
19910 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d  MasterJournal+1]
19920 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19930 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
19940 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
19950 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
19960 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  nal, 0);.  if( r
19970 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
19980 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19990 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  t;.  zMasterJour
199a0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
199b0 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75  al] = 0;..  zJou
199c0 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
199d0 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20  urnal;.  while( 
199e0 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
199f0 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
19a00 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
19a10 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20  int exists;.    
19a20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
19a30 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72  cess(pVfs, zJour
19a40 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
19a50 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
19a60 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ts);.    if( rc!
19a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19a80 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
19a90 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
19aa0 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a    if( exists ){.
19ab0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
19ac0 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
19ad0 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
19ae0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
19af0 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f  ists..      ** O
19b00 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
19b10 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
19b20 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19b30 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  nal. If.      **
19b40 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
19b50 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
19b60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19b70 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
19b80 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20       int c;.    
19b90 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
19ba0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
19bb0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
19bc0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
19bd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19be0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a  3OsOpen(pVfs, zJ
19bf0 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c  ournal, pJournal
19c00 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
19c10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19c20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19c30 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19c40 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
19c50 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
19c60 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e  erJournal(pJourn
19c70 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20  al, zMasterPtr, 
19c80 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
19c90 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
19ca0 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(pJournal);.   
19cb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19cc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19cd0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19ce0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
19cf0 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
19d00 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d  r[0]!=0 && strcm
19d10 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d  p(zMasterPtr, zM
19d20 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  aster)==0;.     
19d30 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
19d40 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
19d50 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
19d60 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
19d70 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
19d80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
19d90 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19da0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a    }.    }.    zJ
19db0 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
19dc0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
19dd0 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20  nal)+1);.  }. . 
19de0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19df0 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d  pMaster);.  rc =
19e00 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
19e10 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
19e20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f  0);..delmaster_o
19e30 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
19e40 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
19e50 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65  l);.  if( pMaste
19e60 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
19e70 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
19e80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ;.    assert( !i
19e90 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20  sOpen(pJournal) 
19ea0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19eb0 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
19ec0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19ed0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
19ee0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
19ef0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74  o change the act
19f00 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ual size of the 
19f10 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
19f20 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
19f30 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20  stem. This only 
19f40 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d  happens when com
19f50 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
19f60 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c  ction,.** or rol
19f70 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e  ling back a tran
19f80 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69  saction (includi
19f90 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ng rolling back 
19fa0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
19fb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69  **.** If the mai
19fc0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
19fd0 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
19fe0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
19ff0 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42   in either.** DB
1a000 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  MOD or OPEN stat
1a010 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
1a020 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
1a030 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65  erwise, the size
1a040 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65   .** of the file
1a050 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e   is changed to n
1a060 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67  Page pages (nPag
1a070 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e*pPager->pageSi
1a080 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49  ze bytes). .** I
1a090 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
1a0a0 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  sk is currently 
1a0b0 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67  larger than nPag
1a0c0 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73  e pages, then us
1a0d0 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72  e the VFS.** xTr
1a0e0 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20  uncate() method 
1a0f0 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a  to truncate it..
1a100 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67  **.** Or, it mig
1a110 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
1a120 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
1a130 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
1a140 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
1a150 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
1a160 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
1a170 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
1a180 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
1a190 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
1a1a0 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
1a1b0 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
1a1c0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
1a1d0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
1a1e0 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
1a1f0 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
1a200 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
1a210 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
1a220 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
1a230 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
1a240 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1a250 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
1a260 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
1a270 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
1a280 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
1a290 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1a2a0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1a2b0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
1a2c0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1a2d0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
1a2e0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
1a2f0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
1a300 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a310 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
1a320 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
1a330 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
1a340 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a350 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45  eState!=PAGER_RE
1a360 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28  ADER );.  .  if(
1a370 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1a380 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67  fd) .   && (pPag
1a390 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1a3a0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
1a3b0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1a3c0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20  ==PAGER_OPEN) . 
1a3d0 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
1a3e0 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
1a3f0 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
1a400 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
1a410 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
1a420 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
1a430 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
1a440 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  ;.    /* TODO: I
1a450 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65  s it safe to use
1a460 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
1a470 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72  e here? */.    r
1a480 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1a490 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
1a4a0 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b  , &currentSize);
1a4b0 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73  .    newSize = s
1a4c0 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65  zPage*(i64)nPage
1a4d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1a4e0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
1a4f0 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
1a500 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
1a510 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
1a520 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a530 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
1a540 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
1a550 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
1a560 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65 6e  else if( (curren
1a570 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e  tSize+szPage)<=n
1a580 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1a590 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70    char *pTmp = p
1a5a0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1a5b0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
1a5c0 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65  (pTmp, 0, szPage
1a5d0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1a5e0 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
1a5f0 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74  Page) == current
1a600 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1a610 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
1a620 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75  ze-szPage) >  cu
1a630 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
1a640 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a650 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1a660 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67  >fd, pTmp, szPag
1a670 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  e, newSize-szPag
1a680 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1a690 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a6a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1a6b0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
1a6c0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1a6d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1a6e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a6f0 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69  ** Return a sani
1a700 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  tized version of
1a710 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
1a720 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c   of OS file pFil
1a730 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  e. The.** return
1a740 20 76 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e   value is guaran
1a750 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77  teed to lie betw
1a760 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53  een 32 and MAX_S
1a770 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69  ECTOR_SIZE..*/.i
1a780 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72  nt sqlite3Sector
1a790 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1a7a0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
1a7b0 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f   iRet = sqlite3O
1a7c0 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c  sSectorSize(pFil
1a7d0 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33  e);.  if( iRet<3
1a7e0 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20  2 ){.    iRet = 
1a7f0 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  512;.  }else if(
1a800 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52   iRet>MAX_SECTOR
1a810 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73  _SIZE ){.    ass
1a820 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ert( MAX_SECTOR_
1a830 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20  SIZE>=512 );.   
1a840 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54   iRet = MAX_SECT
1a850 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72  OR_SIZE;.  }.  r
1a860 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f  eturn iRet;.}../
1a870 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
1a880 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e  ue of the Pager.
1a890 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1a8a0 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ble for the give
1a8b0 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64  n.** pager based
1a8c0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65   on the value re
1a8d0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
1a8e0 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64  ectorSize method
1a8f0 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  .** of the open 
1a900 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1a910 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
1a920 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
1a930 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1a940 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
1a950 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
1a960 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
1a970 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
1a980 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
1a990 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
1a9a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
1a9b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
1a9c0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1a9d0 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
1a9e0 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
1a9f0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
1aa00 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
1aa10 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
1aa20 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1aa30 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
1aa40 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1aa50 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
1aa60 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
1aa70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
1aa80 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
1aa90 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
1aaa0 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
1aab0 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
1aac0 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
1aad0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a  _SECTOR_SIZE..**
1aae0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1aaf0 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49  has the SQLITE_I
1ab00 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1ab10 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74  VERWRITE propert
1ab20 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74  y, then set.** t
1ab30 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1ab40 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20  tor size to its 
1ab50 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35  minimum value (5
1ab60 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73  12).  The purpos
1ab70 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  e of.** pPager->
1ab80 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f  sectorSize is to
1ab90 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61   define the "bla
1aba0 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79  st radius" of by
1abb0 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  tes that.** migh
1abc0 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72  t change if a cr
1abd0 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ash occurs while
1abe0 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69   writing to a si
1abf0 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20  ngle byte in.** 
1ac00 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74  that range.  But
1ac10 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f   with POWERSAFE_
1ac20 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62  OVERWRITE, the b
1ac30 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a  last radius is z
1ac40 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20  ero.** (that is 
1ac50 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f  what POWERSAFE_O
1ac60 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c  VERWRITE means),
1ac70 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20   so we minimize 
1ac80 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69  the sector.** si
1ac90 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72  ze.  For backwar
1aca0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
1acb0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1acc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1acd0 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e  rmat,.** we cann
1ace0 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66  ot reduce the ef
1acf0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1ad00 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a  ize below 512..*
1ad10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1ad20 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
1ad30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
1ad40 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1ad50 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1ad60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1ad70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
1ad80 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73  empFile.   || (s
1ad90 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1ada0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1adb0 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20  ager->fd) & .   
1adc0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1add0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1ade0 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a  E_OVERWRITE)!=0.
1adf0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74    ){.    /* Sect
1ae00 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
1ae10 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
1ae20 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
1ae30 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
1ae40 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
1ae50 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
1ae60 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
1ae70 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
1ae80 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
1ae90 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20  l segfault. */. 
1aea0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1aeb0 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
1aec0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
1aed0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
1aee0 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1aef0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1af00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
1af10 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
1af20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
1af30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1af40 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
1af50 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
1af60 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
1af70 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
1af80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
1af90 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
1afa0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
1afb0 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
1afc0 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
1afd0 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
1afe0 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
1aff0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1b000 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1b010 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1b020 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
1b030 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
1b040 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
1b050 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
1b060 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
1b070 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
1b080 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
1b090 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
1b0a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
1b0b0 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
1b0c0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1b0d0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1b0e0 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
1b0f0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
1b100 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
1b110 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
1b120 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
1b130 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1b140 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
1b150 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
1b160 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
1b170 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
1b180 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
1b190 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1b1a0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1b1b0 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
1b1c0 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
1b1d0 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
1b1e0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1b1f0 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
1b200 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1b210 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
1b220 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
1b230 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
1b240 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
1b250 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
1b260 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
1b270 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
1b280 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
1b290 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
1b2a0 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
1b2b0 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
1b2c0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1b2d0 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
1b2e0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
1b2f0 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
1b300 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
1b310 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
1b320 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
1b330 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
1b340 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
1b350 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
1b360 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
1b370 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
1b380 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
1b390 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
1b3a0 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
1b3b0 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
1b3c0 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
1b3d0 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
1b3e0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1b3f0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
1b400 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
1b410 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1b420 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
1b430 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
1b440 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1b450 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
1b460 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
1b470 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
1b480 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1b490 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
1b4a0 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
1b4b0 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1b4c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1b4d0 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1b4e0 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1b4f0 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1b500 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1b510 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1b520 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1b530 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1b540 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1b550 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1b560 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1b570 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1b580 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1b590 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1b5a0 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1b5b0 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1b5c0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1b5d0 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1b5e0 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1b5f0 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1b600 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1b610 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1b620 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1b630 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1b640 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1b650 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1b660 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1b670 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1b680 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1b690 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1b6a0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1b6b0 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1b6c0 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1b6d0 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1b6e0 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1b6f0 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1b700 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1b710 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1b720 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1b730 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1b740 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1b750 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1b760 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1b770 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1b780 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1b790 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1b7a0 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1b7b0 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1b7c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1b7d0 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1b7e0 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1b7f0 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1b800 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1b810 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1b820 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1b830 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1b840 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1b850 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1b860 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1b870 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1b880 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1b890 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1b8a0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1b8b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1b8c0 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1b8d0 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1b8e0 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1b8f0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1b900 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1b910 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1b920 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1b930 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1b940 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1b950 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1b960 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1b970 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1b980 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1b990 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1b9a0 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1b9b0 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1b9c0 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1b9d0 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1b9e0 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1b9f0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1ba00 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1ba10 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1ba20 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1ba30 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1ba40 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1ba50 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1ba60 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1ba70 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1ba80 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1ba90 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1baa0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1bab0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1bac0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1bad0 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1bae0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1baf0 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1bb00 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1bb10 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1bb20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1bb30 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1bb40 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1bb50 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1bb60 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1bb70 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1bb80 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1bb90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bba0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1bbb0 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1bbc0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1bbd0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1bbe0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1bbf0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1bc00 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1bc10 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1bc20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1bc30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1bc40 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1bc50 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1bc60 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1bc70 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1bc80 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1bc90 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ge rollback */. 
1bca0 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d   int nPlayback =
1bcb0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74   0;       /* Tot
1bcc0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1bcd0 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  es restored from
1bce0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f   journal */..  /
1bcf0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1bd00 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1bd10 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1bd20 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1bd30 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1bd40 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1bd50 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1bd60 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1bd70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1bd80 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1bd90 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1bda0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bdb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1bdc0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1bdd0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1bde0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1bdf0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1be00 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1be10 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1be20 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1be30 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1be40 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1be50 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1be60 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1be70 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1be80 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1be90 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1bea0 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1beb0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1bec0 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1bed0 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1bee0 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1bef0 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1bf00 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1bf10 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1bf20 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1bf30 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1bf40 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1bf50 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1bf60 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1bf70 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1bf80 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1bf90 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78  _unix.c,.  ** mx
1bfa0 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c  Pathname is 512,
1bfb0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61   which is the sa
1bfc0 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75  me as the minimu
1bfd0 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75  m allowable valu
1bfe0 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53  e.  ** for pageS
1bff0 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73  ize..  */.  zMas
1c000 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1c010 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
1c020 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
1c030 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
1c040 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
1c050 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1c060 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  +1);.  if( rc==S
1c070 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1c080 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  ter[0] ){.    rc
1c090 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
1c0a0 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
1c0b0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1c0c0 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
1c0d0 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30   }.  zMaster = 0
1c0e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1c0f0 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b  TE_OK || !res ){
1c100 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1c110 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
1c120 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c130 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65   = 0;.  needPage
1c140 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a  rReset = isHot;.
1c150 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
1c160 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
1c170 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75  r when a readJou
1c180 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20  rnalHdr() or .  
1c190 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
1c1a0 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c  k_one_page() cal
1c1b0 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  l returns SQLITE
1c1c0 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
1c1d0 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72  rror .  ** occur
1c1e0 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  s. .  */.  while
1c1f0 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65  ( 1 ){.    /* Re
1c200 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
1c210 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
1c220 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c230 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
1c240 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
1c250 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
1c260 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c270 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
1c280 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
1c290 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
1c2a0 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
1c2b0 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  s must have fail
1c2c0 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
1c2d0 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
1c2e0 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
1c2f0 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
1c300 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1c310 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1c320 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
1c330 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
1c340 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
1c350 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1c360 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
1c370 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c380 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1c390 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c3a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c3b0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c3c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c3d0 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
1c3e0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
1c3f0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
1c400 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1c410 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
1c420 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
1c430 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
1c440 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
1c450 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
1c460 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
1c470 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
1c480 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
1c490 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
1c4a0 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
1c4b0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
1c4c0 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
1c4d0 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
1c4e0 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
1c4f0 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
1c500 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c510 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1c520 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1c530 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
1c540 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1c550 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
1c560 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
1c570 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1c580 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1c590 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
1c5a0 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
1c5b0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1c5c0 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
1c5d0 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
1c5e0 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
1c5f0 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
1c600 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
1c610 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
1c620 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
1c630 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
1c640 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
1c650 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
1c660 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
1c670 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1c680 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
1c690 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
1c6a0 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
1c6b0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
1c6c0 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
1c6d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1c6e0 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
1c6f0 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
1c700 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
1c710 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
1c720 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
1c730 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
1c740 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
1c750 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
1c760 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
1c770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
1c780 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
1c790 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1c7a0 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
1c7b0 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
1c7c0 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
1c7d0 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
1c7e0 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
1c7f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
1c800 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
1c810 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
1c820 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
1c830 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
1c840 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
1c850 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1c860 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
1c870 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
1c880 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
1c890 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
1c8a0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1c8b0 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
1c8c0 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
1c8d0 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
1c8e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1c8f0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
1c900 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
1c910 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c920 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
1c930 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
1c940 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c950 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
1c960 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1c970 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1c980 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1c990 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
1c9a0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
1c9b0 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
1c9c0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1c9d0 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
1c9e0 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
1c9f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
1ca00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
1ca10 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1ca20 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
1ca30 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
1ca40 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
1ca50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ca60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ca70 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1ca80 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
1ca90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1caa0 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
1cab0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
1cac0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
1cad0 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
1cae0 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
1caf0 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
1cb00 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72  base file and/or
1cb10 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20   page cache..   
1cb20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
1cb30 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
1cb40 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67       if( needPag
1cb50 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  erReset ){.     
1cb60 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1cb70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1cb80 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
1cb90 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1cba0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1cbb0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
1cbc0 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a  Pager,&pPager->j
1cbd0 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29  ournalOff,0,1,0)
1cbe0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1cbf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cc00 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b       nPlayback++
1cc10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1cc20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1cc30 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1cc40 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1cc50 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
1cc60 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1cc70 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1cc80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cc90 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1cca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1ccb0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1ccc0 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74  has been truncat
1ccd0 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20  ed, simply stop 
1cce0 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20  reading and.    
1ccf0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1cd00 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ing the journal.
1cd10 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70   This might happ
1cd20 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  en if the journa
1cd30 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20  l was.          
1cd40 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ** not completel
1cd50 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79  y written and sy
1cd60 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20  nced prior to a 
1cd70 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a  crash.  In that.
1cd80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
1cd90 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
1cda0 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65  should have neve
1cdb0 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  r been written i
1cdc0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
1cdd0 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73  ** first place s
1cde0 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69  o it is OK to si
1cdf0 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65  mply abandon the
1ce00 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20   rollback. */.  
1ce10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ce20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1ce30 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1ce40 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ack;.        }el
1ce50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1ce60 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
1ce70 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71  e to rollback, q
1ce80 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  uit and return t
1ce90 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  he error.       
1cea0 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69     ** code.  Thi
1ceb0 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
1cec0 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
1ced0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a  the error state.
1cee0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1cef0 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20  that no further 
1cf00 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e  harm will be don
1cf10 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20  e.  Perhaps the 
1cf20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a  next.          *
1cf30 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d  * process to com
1cf40 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20  e along will be 
1cf50 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
1cf60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
1cf70 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1cf80 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1cf90 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
1cfa0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1cfb0 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
1cfc0 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
1cfd0 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
1cfe0 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69  ck:.  /* Followi
1cff0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
1d000 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d010 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20   should be back 
1d020 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  in its original.
1d030 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72    ** state prior
1d040 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
1d050 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d060 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a  , so invoke the.
1d070 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54    ** SQLITE_FCNT
1d080 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66  L_DB_UNCHANGED f
1d090 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68  ile-control meth
1d0a0 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  od to disable th
1d0b0 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e  e.  ** assertion
1d0c0 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
1d0d0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
1d0e0 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f  s modified..  */
1d0f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d100 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67 65  EBUG.  if( pPage
1d110 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
1d120 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
1d130 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
1d140 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54  pPager->fd,SQLIT
1d150 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1d160 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e  NGED,0);.  }.#en
1d170 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  dif..  /* If thi
1d180 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
1d190 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
1d1a0 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
1d1b0 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
1d1c0 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
1d1d0 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
1d1e0 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
1d1f0 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
1d200 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
1d210 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
1d220 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
1d230 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
1d240 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
1d250 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
1d260 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
1d270 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
1d280 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
1d290 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
1d2a0 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
1d2b0 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
1d2c0 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
1d2d0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
1d2e0 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
1d2f0 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
1d300 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
1d310 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
1d320 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
1d330 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
1d340 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
1d350 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
1d360 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1d370 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
1d380 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
1d390 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
1d3a0 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
1d3b0 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
1d3c0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
1d3d0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1d3e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1d3f0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1d400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
1d410 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1d420 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
1d430 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1d440 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1d450 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1d460 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1d470 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
1d480 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d490 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d4a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
1d4b0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
1d4c0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1d4d0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
1d4e0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1d4f0 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20  ER_OPEN).  ){.  
1d500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d510 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20  gerSync(pPager, 
1d520 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1d530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d540 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
1d550 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
1d560 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
1d570 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20  !='\0', 0);.    
1d580 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1d590 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1d5a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d5b0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1d5c0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
1d5d0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1d5e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1d5f0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
1d600 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
1d610 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
1d620 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
1d630 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
1d640 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1d650 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1d660 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
1d670 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1d680 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1d690 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d6a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f  ;.  }.  if( isHo
1d6b0 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29  t && nPlayback )
1d6c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
1d6d0 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  g(SQLITE_NOTICE_
1d6e0 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b  RECOVER_ROLLBACK
1d6f0 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25 64 20  , "recovered %d 
1d700 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a  pages from %s",.
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d720 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65  nPlayback, pPage
1d730 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
1d740 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
1d750 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1d760 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
1d770 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
1d780 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
1d790 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
1d7a0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1d7b0 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
1d7c0 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
1d7d0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
1d7e0 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
1d7f0 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1d800 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
1d810 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
1d820 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1d830 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1d840 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1d850 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f  t for page pPg o
1d860 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
1d870 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f  se file and into
1d880 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e   .** pPg->pData.
1d890 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   A shared lock o
1d8a0 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
1d8b0 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
1d8c0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62  tabase.** file b
1d8d0 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
1d8e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1d8f0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69  *.** If page 1 i
1d900 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65  s read, then the
1d910 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
1d920 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1d930 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61  set to.** the va
1d940 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
1d950 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1d960 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
1d970 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1d980 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1d990 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1d9a0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74  he caller..** Ot
1d9b0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1d9c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1d9d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1d9e0 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a  adDbPage(PgHdr *
1d9f0 70 50 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29  pPg, u32 iFrame)
1da00 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1da10 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1da20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1da30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1da40 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50   page pPg */.  P
1da50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
1da60 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50  pgno;       /* P
1da70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65  age number to re
1da80 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ad */.  int rc =
1da90 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1daa0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1dab0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73  ode */.  int pgs
1dac0 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  z = pPager->page
1dad0 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20  Size; /* Number 
1dae0 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
1daf0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1db00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1db10 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 21  AGER_READER && !
1db20 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
1db30 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1db40 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ->fd) );..#ifnde
1db50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1db60 4c 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20 29  L.  if( iFrame )
1db70 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20  {.    /* Try to 
1db80 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72  pull the page fr
1db90 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  om the write-ahe
1dba0 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72  ad log. */.    r
1dbb0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65  c = sqlite3WalRe
1dbc0 61 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  adFrame(pPager->
1dbd0 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67  pWal, iFrame, pg
1dbe0 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  sz, pPg->pData);
1dbf0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
1dc00 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66    {.    i64 iOff
1dc10 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
1dc20 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
1dc30 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
1dc40 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1dc50 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44  ger->fd, pPg->pD
1dc60 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73  ata, pgsz, iOffs
1dc70 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  et);.    if( rc=
1dc80 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1dc90 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1dca0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1dcb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1dcc0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
1dcd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1dce0 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64    /* If the read
1dcf0 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c   is unsuccessful
1dd00 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65  , set the dbFile
1dd10 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68  Vers[] to someth
1dd20 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ing.      ** tha
1dd30 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  t will never be 
1dd40 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72  a valid file ver
1dd50 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72  sion.  dbFileVer
1dd60 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20  s[] is a copy.  
1dd70 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20      ** of bytes 
1dd80 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61  24..39 of the da
1dd90 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32  tabase.  Bytes 2
1dda0 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77  8..31 should alw
1ddb0 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ays be.      ** 
1ddc0 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65  zero or the size
1ddd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1dde0 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20   in page. Bytes 
1ddf0 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33  32..35 and 35..3
1de00 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c  9.      ** shoul
1de10 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72  d be page number
1de20 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65  s which are neve
1de30 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20 53  r 0xffffffff.  S
1de40 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20  o filling.      
1de50 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  ** pPager->dbFil
1de60 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c  eVers[] with all
1de70 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f 75   0xff bytes shou
1de80 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20  ld suffice..    
1de90 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
1dea0 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64  r an encrypted d
1deb0 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69 74  atabase, the sit
1dec0 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63  uation is more c
1ded0 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20  omplex:  bytes. 
1dee0 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f       ** 24..39 o
1def0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1df00 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20  re white noise. 
1df10 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62 69   But the probabi
1df20 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a  lity of.      **
1df30 20 77 68 69 74 65 20 6e 6f 69 73 65 20 65 71 75   white noise equ
1df40 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f  aling 16 bytes o
1df50 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68  f 0xff is vanish
1df60 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20  ingly small so. 
1df70 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c       ** we shoul
1df80 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20  d still be ok.. 
1df90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65       */.      me
1dfa0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46  mset(pPager->dbF
1dfb0 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73  ileVers, 0xff, s
1dfc0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1dfd0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1dfe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
1dff0 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28  *dbFileVers = &(
1e000 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  (u8*)pPg->pData)
1e010 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  [24];.      memc
1e020 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
1e030 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
1e040 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  rs, sizeof(pPage
1e050 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1e060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44  .    }.  }.  COD
1e070 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d  EC1(pPager, pPg-
1e080 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c  >pData, pgno, 3,
1e090 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1e0a0 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47  EM_BKPT);..  PAG
1e0b0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1e0c0 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
1e0d0 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
1e0e0 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
1e0f0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
1e100 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
1e110 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50  ger, pgno));.  P
1e120 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43  AGERTRACE(("FETC
1e130 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  H %d page %d has
1e140 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1e150 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1e160 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
1e170 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1e180 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75  (pPg)));..  retu
1e190 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e1a0 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65  Update the value
1e1b0 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63   of the change-c
1e1c0 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74  ounter at offset
1e1d0 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a  s 24 and 92 in.*
1e1e0 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  * the header and
1e1f0 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73   the sqlite vers
1e200 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
1e210 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54  fset 96..**.** T
1e220 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64  his is an uncond
1e230 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20  itional update. 
1e240 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61   See also the pa
1e250 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1e260 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74  ounter().** rout
1e270 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75  ine which only u
1e280 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1e290 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65  e-counter if the
1e2a0 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61   update is actua
1e2b0 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61  lly.** needed, a
1e2c0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1e2d0 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  the pPager->chan
1e2e0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74  geCountDone stat
1e2f0 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
1e300 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
1e310 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1e320 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29  nter(PgHdr *pPg)
1e330 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  {.  u32 change_c
1e340 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e  ounter;..  /* In
1e350 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1e360 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1e370 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1e380 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
1e390 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1e3a0 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
1e3b0 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72  (u8*)pPg->pPager
1e3c0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b  ->dbFileVers)+1;
1e3d0 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1e3e0 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1e3f0 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1e400 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ter);..  /* Also
1e410 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
1e420 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1e430 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
1e440 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74   and in.  ** byt
1e450 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20  es 92..95 store 
1e460 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1e470 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
1e480 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a   version number.
1e490 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a    ** is valid. *
1e4a0 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  /.  put32bits(((
1e4b0 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1e4c0 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+92, change_cou
1e4d0 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69  nter);.  put32bi
1e4e0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1e4f0 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54  pData)+96, SQLIT
1e500 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
1e510 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
1e520 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1e530 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e540 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  n is invoked onc
1e550 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  e for each page 
1e560 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1e570 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65   been .** writte
1e580 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66  n into the log f
1e590 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74  ile when a WAL t
1e5a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1e5b0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61  lled back..** Pa
1e5c0 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74  rameter iPg is t
1e5d0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1e5e0 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65  f said page. The
1e5f0 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a   pCtx argument .
1e600 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ** is actually a
1e610 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1e620 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
1e630 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69  .**.** If page i
1e640 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  Pg is present in
1e650 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20   the cache, and 
1e660 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1e670 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a  ng references,.*
1e680 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65  * it is discarde
1e690 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1e6a0 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   there are one o
1e6b0 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69  r more outstandi
1e6c0 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ng.** references
1e6d0 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1e6e0 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66  nt is reloaded f
1e6f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e700 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65  . If the.** atte
1e710 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f  mpt to reload co
1e720 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1e730 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69  atabase is requi
1e740 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a  red and fails, .
1e750 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
1e760 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1e770 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1e780 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
1e790 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  int pagerUndoCal
1e7a0 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78  lback(void *pCtx
1e7b0 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69  , Pgno iPg){.  i
1e7c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e7d0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1e7e0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43  er = (Pager *)pC
1e7f0 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  tx;.  PgHdr *pPg
1e800 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ;..  assert( pag
1e810 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1e820 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69   );.  pPg = sqli
1e830 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
1e840 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69  Pager, iPg);.  i
1e850 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66  f( pPg ){.    if
1e860 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
1e870 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29  ageRefcount(pPg)
1e880 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
1e890 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
1e8a0 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
1e8b0 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d 65        u32 iFrame
1e8c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1e8d0 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
1e8e0 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1e8f0 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69  l, pPg->pgno, &i
1e900 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
1e910 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e920 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e930 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20  readDbPage(pPg, 
1e940 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  iFrame);.      }
1e950 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1e960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e970 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1e980 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
1e990 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1e9a0 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
1e9b0 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ll(pPg);.    }. 
1e9c0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c   }..  /* Normall
1e9d0 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  y, if a transact
1e9e0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1e9f0 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70  ck, any backup p
1ea00 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a  rocesses are.  *
1ea10 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74  * updated as dat
1ea20 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20  a is copied out 
1ea30 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1ea40 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f  journal and into
1ea50 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
1ea60 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  se. This is not 
1ea70 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62  generally possib
1ea80 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61  le with a WAL da
1ea90 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20  tabase, as.  ** 
1eaa0 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65  rollback involve
1eab0 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74  s simply truncat
1eac0 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  ing the log file
1ead0 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20  . Therefore, if 
1eae0 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65  one.  ** or more
1eaf0 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72   frames have alr
1eb00 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1eb10 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e  n to the log (an
1eb20 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a  d therefore .  *
1eb30 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e  * also copied in
1eb40 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61  to the backup da
1eb50 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74  tabases) as part
1eb60 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
1eb70 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62  tion,.  ** the b
1eb80 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72  ackups must be r
1eb90 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  estarted..  */. 
1eba0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
1ebb0 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
1ebc0 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72  ackup);..  retur
1ebd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1ebe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ebf0 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
1ec00 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
1ec10 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61   on a WAL databa
1ec20 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1ec30 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  t pagerRollbackW
1ec40 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1ec50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1ec80 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ode */.  PgHdr *
1ec90 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
1eca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1ecb0 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
1ecc0 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20  to revert */..  
1ecd0 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73  /* For all pages
1ece0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
1ecf0 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
1ed00 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61   dirty or have a
1ed10 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
1ed20 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f   written (but no
1ed30 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20  t committed) to 
1ed40 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f  the log file, do
1ed50 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a   one of the .  *
1ed60 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  * following:.  *
1ed70 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61  *.  **   + Disca
1ed80 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61  rd the cached pa
1ed90 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d  ge (if refcount=
1eda0 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b  =0), or.  **   +
1edb0 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e   Reload page con
1edc0 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1edd0 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f  tabase (if refco
1ede0 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70  unt>0)..  */.  p
1edf0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1ee00 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1ee10 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
1ee20 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72  e3WalUndo(pPager
1ee30 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64  ->pWal, pagerUnd
1ee40 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
1ee50 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c   *)pPager);.  pL
1ee60 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1ee70 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1ee80 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
1ee90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1eea0 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  MIT_CONCURRENT. 
1eeb0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1eec0 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  n CONCURRENT tra
1eed0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 70  nsaction, then p
1eee0 61 67 65 20 31 20 6d 75 73 74 20 62 65 20 72 65  age 1 must be re
1eef0 72 65 61 64 20 66 72 6f 6d 20 0a 20 20 2a 2a 20  read from .  ** 
1ef00 74 68 65 20 64 62 20 66 69 6c 65 2c 20 65 76 65  the db file, eve
1ef10 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 64  n if it is not d
1ef20 69 72 74 79 2e 20 54 68 69 73 20 69 73 20 62 65  irty. This is be
1ef30 63 61 75 73 65 20 74 68 65 20 62 2d 74 72 65 65  cause the b-tree
1ef40 20 6c 61 79 65 72 20 0a 20 20 2a 2a 20 6d 61 79   layer .  ** may
1ef50 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 7a 65   have already ze
1ef60 72 6f 65 64 20 74 68 65 20 6e 46 72 65 65 20 61  roed the nFree a
1ef70 6e 64 20 69 54 72 75 6e 6b 20 68 65 61 64 65 72  nd iTrunk header
1ef80 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 69   fields.  */.  i
1ef90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1efa0 20 26 26 20 28 70 4c 69 73 74 3d 3d 30 20 7c 7c   && (pList==0 ||
1efb0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 21 3d 31 29   pList->pgno!=1)
1efc0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c   && pPager->pAll
1efd0 52 65 61 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  Read ){.    rc =
1efe0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1eff0 63 6b 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72  ck((void*)pPager
1f000 2c 20 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 1);.  }.#endif
1f010 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ..  while( pList
1f020 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1f030 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
1f040 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pNext = pList->p
1f050 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20  Dirty;.    rc = 
1f060 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1f070 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  k((void *)pPager
1f080 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
1f090 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
1f0a0 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
1f0b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1f0c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1f0d0 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
1f0e0 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1f0f0 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c  (). As well as l
1f100 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  ogging.** the co
1f110 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69  ntents of the li
1f120 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64  st of pages head
1f130 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e  ed by pList (con
1f140 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
1f150 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1f160 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79  ion notifies any
1f170 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70   active backup p
1f180 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68  rocesses that th
1f190 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20  e pages have.** 
1f1a0 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  changed. .**.** 
1f1b0 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  The list of page
1f1c0 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  s passed into th
1f1d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c  is routine is al
1f1e0 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70  ways sorted by p
1f1f0 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48  age number..** H
1f200 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20  ence, if page 1 
1f210 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65  appears anywhere
1f220 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74   on the list, it
1f230 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72   will be the fir
1f240 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61  st page..*/ .sta
1f250 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c  tic int pagerWal
1f260 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20  Frames(.  Pager 
1f270 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
1f280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1f290 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
1f2a0 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20  gHdr *pList,    
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f2c0 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73  * List of frames
1f2d0 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e   to log */.  Pgn
1f2e0 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  o nTruncate,    
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f300 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66  Database size af
1f310 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20  ter this commit 
1f320 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1f330 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1f340 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f350 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74  this is a commit
1f360 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1f390 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1f3a0 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20   nList;         
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f3c0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1f3d0 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67  in pList */.  Pg
1f3e0 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f400 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1f410 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73  r pages */..  as
1f420 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
1f430 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
1f440 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20  pList );.#ifdef 
1f450 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1f460 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1f470 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69  e page list is i
1f480 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
1f490 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69  r */.  for(p=pLi
1f4a0 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72  st; p && p->pDir
1f4b0 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  ty; p=p->pDirty)
1f4c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
1f4d0 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74  >pgno < p->pDirt
1f4e0 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23  y->pgno );.  }.#
1f4f0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1f500 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d   pList->pDirty==
1f510 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b  0 || isCommit );
1f520 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20  .  if( isCommit 
1f530 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57  ){.    /* If a W
1f540 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1f550 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  s being committe
1f560 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  d, there is no p
1f570 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a  oint in writing.
1f580 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73      ** any pages
1f590 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
1f5a0 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  rs greater than 
1f5b0 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74  nTruncate into t
1f5c0 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20  he WAL file..   
1f5d0 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65   ** They will ne
1f5e0 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61  ver be read by a
1f5f0 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65  ny client. So re
1f600 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
1f610 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a  he pDirty.    **
1f620 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20   list here. */. 
1f630 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78     PgHdr **ppNex
1f640 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20  t = &pList;.    
1f650 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66  nList = 0;.    f
1f660 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70  or(p=pList; (*pp
1f670 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d  Next = p)!=0; p=
1f680 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1f690 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e    if( p->pgno<=n
1f6a0 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1f6b0 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d      ppNext = &p-
1f6c0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20  >pDirty;.       
1f6d0 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20   nList++;.      
1f6e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1f6f0 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d  rt( pList );.  }
1f700 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20  else{.    nList 
1f710 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 1;.  }.  pPage
1f720 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
1f730 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c  TAT_WRITE] += nL
1f740 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73  ist;..  if( pLis
1f750 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
1f760 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
1f770 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20  ounter(pList);. 
1f780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1f790 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70  Frames(pPager->p
1f7a0 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67  Wal, .      pPag
1f7b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c  er->pageSize, pL
1f7c0 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20  ist, nTruncate, 
1f7d0 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72  isCommit, pPager
1f7e0 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20  ->walSyncFlags. 
1f7f0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1f800 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
1f810 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20  r->pBackup ){.  
1f820 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1f830 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1f840 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
1f850 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
1f860 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67  ->pBackup, p->pg
1f870 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61  no, (u8 *)p->pDa
1f880 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1f890 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1f8a0 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73  ECK_PAGES.  pLis
1f8b0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1f8c0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1f8d0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66  r->pPCache);.  f
1f8e0 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1f8f0 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1f900 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
1f910 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  ash(p);.  }.#end
1f920 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
1f930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
1f940 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  a read transacti
1f950 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a  on on the WAL..*
1f960 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f970 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c  e used to be cal
1f980 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e  led "pagerOpenSn
1f990 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73  apshot()" becaus
1f9a0 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79  e it essentially
1f9b0 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70  .** makes a snap
1f9c0 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61  shot of the data
1f9d0 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72  base at the curr
1f9e0 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d  ent point in tim
1f9f0 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a  e and preserves.
1fa00 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  ** that snapshot
1fa10 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
1fa20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20  reader in spite 
1fa30 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20  of concurrently 
1fa40 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74  changes by.** ot
1fa50 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63  her writers or c
1fa60 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f  heckpointers..*/
1fa70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1fa80 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
1fa90 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
1faa0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fac0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1fad0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1fae0 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20  changed = 0;    
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fb00 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73  rue if cache mus
1fb10 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20  t be reset */.. 
1fb20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1fb30 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1fb40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fb50 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1fb60 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
1fb70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
1fb80 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71  ADER );..  /* sq
1fb90 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1fba0 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73  ransaction() was
1fbb0 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20   not called for 
1fbc0 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a  the previous.  *
1fbd0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  * transaction in
1fbe0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
1fbf0 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c  CLUSIVE.  So cal
1fc00 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65  l it now.  If we
1fc10 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63  .  ** are in loc
1fc20 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c  king_mode=NORMAL
1fc30 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77   and EndRead() w
1fc40 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  as previously ca
1fc50 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64  lled,.  ** the d
1fc60 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73  uplicate call is
1fc70 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a   harmless..  */.
1fc80 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
1fc90 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
1fca0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1fcb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1fcc0 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
1fcd0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1fce0 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20  l, &changed);.  
1fcf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fd00 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a  K || changed ){.
1fd10 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1fd20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1fd30 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
1fd40 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66  ) ) sqlite3OsUnf
1fd50 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
1fd60 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   0, 0);.  }..  r
1fd70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1fd80 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
1fd90 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1fda0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1fdb0 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d   transition from
1fdc0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74   PAGER_OPEN.** t
1fdd0 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
1fde0 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  tate to determin
1fdf0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1fe00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1fe10 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73  ** in pages (ass
1fe20 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73  uming the page s
1fe30 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ize currently st
1fe40 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61  ored in Pager.pa
1fe50 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  geSize)..**.** I
1fe60 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1fe70 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
1fe80 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
1fe90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1fea0 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65  abase.** in page
1feb0 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a  s is stored in *
1fec0 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73  pnPage. Otherwis
1fed0 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
1fee0 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c   (perhaps.** SQL
1fef0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
1ff00 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1ff10 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74   *pnPage is left
1ff20 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a   unmodified..*/.
1ff30 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ff40 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
1ff50 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70  *pPager, Pgno *p
1ff60 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
1ff70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1ff80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1ff90 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
1ffa0 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
1ffb0 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20  * Query the WAL 
1ffc0 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  sub-system for t
1ffd0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ffe0 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28  . The WalDbsize(
1fff0 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ).  ** function 
20000 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  returns zero if 
20010 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f  the WAL is not o
20020 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e  pen (i.e. Pager.
20030 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  pWal==0), or.  *
20040 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
20050 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76  e size is not av
20060 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74  ailable. The dat
20070 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
20080 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  t.  ** available
20090 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
200a0 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20  b-system if the 
200b0 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74  log file is empt
200c0 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  y or.  ** contai
200d0 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d  ns no valid comm
200e0 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
200f0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ns..  */.  asser
20100 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20110 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
20120 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20130 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
20140 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
20150 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
20160 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
20170 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
20180 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67  ile==0 );.  nPag
20190 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62  e = sqlite3WalDb
201a0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61  size(pPager->pWa
201b0 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  l);..  /* If the
201c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
201d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
201e0 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
201f0 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  e from the.  ** 
20200 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20  WAL sub-system, 
20210 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61  determine the pa
20220 67 65 20 63 6f 75 6e 74 65 20 62 61 73 65 64 20  ge counte based 
20230 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20  on the size of. 
20240 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
20250 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73   file.  If the s
20260 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20270 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
20280 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  an.  ** integer 
20290 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
202a0 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64  page-size, round
202b0 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   up the result..
202c0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
202d0 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 73  ==0 && ALWAYS(is
202e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
202f0 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d  ) ){.    i64 n =
20300 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20310 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
20320 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74  f db file in byt
20330 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  es */.    int rc
20340 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
20350 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
20360 20 26 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63   &n);.    if( rc
20370 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20380 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20390 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20      }.    nPage 
203a0 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67  = (Pgno)((n+pPag
203b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20  er->pageSize-1) 
203c0 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  / pPager->pageSi
203d0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
203e0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
203f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
20400 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
20410 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ater than the.  
20420 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
20430 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
20440 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
20450 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
20460 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
20470 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
20480 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
20490 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
204a0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
204b0 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
204c0 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70  nPage;.  }..  *p
204d0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
204e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
204f0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
20500 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
20510 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
20520 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
20530 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
20540 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
20550 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
20560 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64   exists if the d
20570 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
20580 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74  mpy, or verify t
20590 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  hat the *-wal fi
205a0 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  le does.** not e
205b0 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e  xist (by deletin
205c0 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74  g it) if the dat
205d0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d  abase file is em
205e0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
205f0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
20600 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20  t empty and the 
20610 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
20620 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65  s, open the page
20630 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65  r.** in WAL mode
20640 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
20650 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69  se is empty or i
20660 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20  f no *-wal file 
20670 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66  exists and.** if
20680 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
20690 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65  , make sure Page
206a0 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  r.journalMode is
206b0 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50   not set to.** P
206c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
206d0 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  _WAL..**.** Retu
206e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  rn SQLITE_OK or 
206f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
20700 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
20710 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52  must hold a SHAR
20720 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
20730 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
20740 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  call this.** fun
20750 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61  ction. Because a
20760 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
20770 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
20780 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64  is required to d
20790 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20  elete .** a WAL 
207a0 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20  on a none-empty 
207b0 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65  database, this e
207c0 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20  nsures there is 
207d0 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  no race conditio
207e0 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  n .** between th
207f0 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f  e xAccess() belo
20800 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65  w and an xDelete
20810 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  () being execute
20820 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74  d by some .** ot
20830 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
20840 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20850 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
20860 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
20870 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
20880 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
20890 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
208a0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
208b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
208c0 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
208d0 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  D_LOCK );..  if(
208e0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
208f0 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
20900 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
20910 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20920 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
20930 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ts */.    Pgno n
20940 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
20950 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20960 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
20970 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20  file */..    rc 
20980 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
20990 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
209a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
209b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
209c0 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
209d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
209e0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
209f0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
20a00 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Wal, 0);.      i
20a10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
20a20 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
20a30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
20a40 4b 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d  K;.      isWal =
20a50 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
20a60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20a70 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20  3OsAccess(.     
20a80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66       pPager->pVf
20a90 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
20aa0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
20ab0 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20  XISTS, &isWal.  
20ac0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
20ad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20ae0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
20af0 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  isWal ){.       
20b00 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
20b10 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
20b20 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
20b30 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e)==0 );.       
20b40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20b50 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72  erOpenWal(pPager
20b60 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
20b70 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
20b80 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
20b90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
20ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
20bb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
20bc0 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
20bd0 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  ODE_DELETE;.    
20be0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
20bf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
20c00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  dif../*.** Playb
20c10 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
20c20 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66  avepoint. Or, if
20c30 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
20c40 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
20c50 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
20c60 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
20c70 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61  le. The case pSa
20c80 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63  vepoint==NULL oc
20c90 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20  curs when .** a 
20ca0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d  ROLLBACK TO comm
20cb0 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  and is invoked o
20cc0 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68  n a SAVEPOINT th
20cd0 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  at is a transact
20ce0 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ion .** savepoin
20cf0 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53  t..**.** When pS
20d00 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  avepoint is not 
20d10 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20  NULL (meaning a 
20d20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
20d30 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a  savepoint is .**
20d40 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
20d50 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ck), then the ro
20d60 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
20d70 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73  of up to three s
20d80 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72  tages,.** perfor
20d90 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  med in the order
20da0 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a   specified:.**.*
20db0 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
20dc0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
20dd0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20de0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  l starting at by
20df0 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74  te.**     offset
20e00 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20e10 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
20e20 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20  inuing to .**   
20e30 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
20e40 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20  .iHdrOffset, or 
20e50 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
20e60 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  e main journal.*
20e70 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61  *     file if Pa
20e80 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
20e90 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e  rOffset is zero.
20ea0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61  .**.**   * If Pa
20eb0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
20ec0 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a  rOffset is not z
20ed0 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ero, then pages 
20ee0 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20  are played.**   
20ef0 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20    back starting 
20f00 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
20f10 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
20f20 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  ely following .*
20f30 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
20f40 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
20f50 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
20f60 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
20f70 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ile..**.**   * P
20f80 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c  ages are then pl
20f90 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
20fa0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
20fb0 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile, starting.**
20fc0 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61       with the Pa
20fd0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75  gerSavepoint.iSu
20fe0 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75  bRec and continu
20ff0 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ing to the end o
21000 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  f.**     the jou
21010 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
21020 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   Throughout the 
21030 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73  rollback process
21040 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61  , each time a pa
21050 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  ge is rolled bac
21060 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  k, the.** corres
21070 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
21080 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73  et in a bitvec s
21090 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62  tructure (variab
210a0 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a  le pDone in the.
210b0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
210c0 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69  n below). This i
210d0 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
210e0 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20   that a page is 
210f0 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  only.** rolled b
21100 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ack the first ti
21110 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
21120 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a  ered in either j
21130 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
21140 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e   pSavepoint is N
21150 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ULL, then pages 
21160 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20  are only played 
21170 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
21180 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  in.** journal fi
21190 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
211a0 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65  need for a bitve
211b0 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  c in this case..
211c0 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
211d0 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61  case, before pla
211e0 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20  yback commences 
211f0 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  the Pager.dbSize
21200 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20   variable.** is 
21210 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  reset to the val
21220 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20  ue that it held 
21230 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21240 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a  the savepoint .*
21250 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  * (or transactio
21260 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68  n). No page with
21270 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67   a page-number g
21280 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
21290 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61   value.** is pla
212a0 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65  yed back. If one
212b0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
212c0 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69  it is simply ski
212d0 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
212e0 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
212f0 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
21300 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
21310 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
21320 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
21330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21340 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
21350 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
21360 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
21370 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
21380 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
21390 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
213a0 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
213b0 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72  cords */.  int r
213c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
213d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
213e0 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
213f0 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
21400 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
21410 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
21420 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
21430 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21440 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
21450 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
21460 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21470 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
21480 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a  ITER_LOCKED );..
21490 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
214a0 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
214b0 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
214c0 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
214d0 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
214e0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
214f0 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
21500 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
21510 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
21520 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
21530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21540 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
21550 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
21560 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
21570 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
21580 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
21590 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
215a0 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
215b0 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
215c0 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
215d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
215e0 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
215f0 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
21600 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
21610 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
21620 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
21630 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
21640 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
21650 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
21660 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21670 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
21680 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
21690 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
216a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
216b0 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
216c0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
216d0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
216e0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
216f0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
21700 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
21710 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
21720 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21730 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
21740 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21750 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
21760 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
21770 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21780 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
21790 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
217a0 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
217b0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
217c0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
217d0 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
217e0 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
217f0 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
21800 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
21810 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21820 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
21830 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
21840 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
21850 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
21860 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
21870 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
21880 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
21890 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
218a0 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
218b0 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
218c0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
218d0 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
218e0 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
218f0 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
21900 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
21910 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
21920 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
21930 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
21940 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
21950 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
21960 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
21970 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
21980 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
21990 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
219a0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
219b0 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
219c0 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
219d0 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
219e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
219f0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
21a00 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
21a10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21a20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21a30 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
21a40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
21a50 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
21a60 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
21a70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
21a80 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
21a90 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
21aa0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
21ab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
21ac0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21ad0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
21ae0 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
21af0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
21b00 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
21b10 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
21b20 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
21b30 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
21b40 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
21b50 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
21b60 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
21b70 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21b80 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
21b90 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
21ba0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
21bb0 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
21bc0 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
21bd0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
21be0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
21bf0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
21c00 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
21c10 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
21c20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
21c30 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21c40 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
21c50 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
21c60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
21c70 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
21c80 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
21c90 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
21ca0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
21cb0 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
21cc0 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
21cd0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
21ce0 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
21cf0 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
21d00 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
21d10 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
21d20 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
21d30 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
21d40 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
21d50 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
21d60 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
21d70 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
21d80 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
21d90 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
21da0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
21db0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
21dc0 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
21dd0 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
21de0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
21df0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
21e00 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
21e10 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
21e20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
21e30 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
21e40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
21e50 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
21e60 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
21e70 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
21e80 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
21e90 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
21ea0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
21eb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
21ec0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
21ed0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
21ee0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
21ef0 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
21f00 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
21f10 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21f20 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
21f30 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21f40 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
21f50 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
21f60 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
21f70 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
21f80 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
21f90 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
21fa0 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
21fb0 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
21fc0 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
21fd0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
21fe0 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
21ff0 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
22000 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
22010 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
22020 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
22030 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
22040 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
22050 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
22060 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22070 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
22080 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70  et = (i64)pSavep
22090 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
220a0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
220b0 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67  e);..    if( pag
220c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
220d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
220e0 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
220f0 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  ntUndo(pPager->p
22100 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d  Wal, pSavepoint-
22110 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  >aWalData);.    
22120 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  }.    for(ii=pSa
22130 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
22140 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
22150 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
22160 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
22170 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
22180 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70  et==(i64)ii*(4+p
22190 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
221a0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
221b0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
221c0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
221d0 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
221e0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
221f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22200 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
22210 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
22220 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
22230 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22240 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
22250 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
22260 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
22270 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
22280 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
22290 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
222a0 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
222b0 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
222c0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
222d0 67 20 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65  g to recycle cle
222e0 61 6e 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61  an and unused pa
222f0 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ges..*/.void sql
22300 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
22310 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
22320 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
22330 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
22340 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
22350 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
22360 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
22370 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
22380 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
22390 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
223a0 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a  at are allowed.*
223b0 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  * before attempt
223c0 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67  ing to spill pag
223d0 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  es to journal..*
223e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
223f0 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50  erSetSpillsize(P
22400 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22410 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74  t mxPage){.  ret
22420 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
22430 65 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50  eSetSpillsize(pP
22440 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
22450 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
22460 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46   Invoke SQLITE_F
22470 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62  CNTL_MMAP_SIZE b
22480 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ased on the curr
22490 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d  ent value of szM
224a0 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  map..*/.static v
224b0 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c  oid pagerFixMapl
224c0 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
224d0 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  er){.#if SQLITE_
224e0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
224f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22500 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b  fd = pPager->fd;
22510 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64  .  if( isOpen(fd
22520 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64  ) && fd->pMethod
22530 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29  s->iVersion>=3 )
22540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
22550 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d  t64 sz;.    sz =
22560 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b   pPager->szMmap;
22570 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73  .    pPager->bUs
22580 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b  eFetch = (sz>0);
22590 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
225a0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
225b0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
225c0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
225d0 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64  , &sz);.  }.#end
225e0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  if.}../*.** Chan
225f0 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  ge the maximum s
22600 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72  ize of any memor
22610 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f  y mapping made o
22620 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22630 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ile..*/.void sql
22640 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
22650 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  Limit(Pager *pPa
22660 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  ger, sqlite3_int
22670 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50  64 szMmap){.  pP
22680 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73  ager->szMmap = s
22690 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69  zMmap;.  pagerFi
226a0 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72  xMaplimit(pPager
226b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
226c0 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
226d0 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
226e0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76   the pager..*/.v
226f0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
22700 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50  Shrink(Pager *pP
22710 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
22720 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61  PcacheShrink(pPa
22730 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
22740 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73  ../*.** Adjust s
22750 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70  ettings of the p
22760 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70  ager to those sp
22770 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 70  ecified in the p
22780 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  gFlags parameter
22790 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76  ..**.** The "lev
227a0 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26  el" in pgFlags &
227b0 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
227c0 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65  US_MASK sets the
227d0 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f   robustness.** o
227e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
227f0 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
22800 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f  OS crashes or po
22810 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a  wer failures by.
22820 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ** changing the 
22830 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
22840 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  )s when writing 
22850 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  the journals..**
22860 20 54 68 65 72 65 20 61 72 65 20 66 6f 75 72 20   There are four 
22870 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
22880 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
22890 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
228a0 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
228b0 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
228c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
228d0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
228e0 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
228f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
22900 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
22910 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
22920 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
22930 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
22950 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
22960 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
22970 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
22980 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
22990 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
229a0 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
229b0 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
229c0 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
229d0 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
229e0 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
229f0 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
22a00 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
22a10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
22a20 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
22a30 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
22a40 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
22a50 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
22a60 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
22a70 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
22a80 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
22a90 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
22aa0 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
22ab0 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
22ac0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
22ad0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
22ae0 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
22af0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
22b00 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
22b10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22b20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
22b30 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
22b40 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
22b50 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
22b60 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
22b70 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
22b80 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
22b90 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
22ba0 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
22bb0 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
22bc0 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
22bd0 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
22be0 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
22bf0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
22c00 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
22c10 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
22c30 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
22c40 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
22c50 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
22c60 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  back..**.**    E
22c70 58 54 52 41 20 20 20 20 20 54 68 69 73 20 69 73  XTRA     This is
22c80 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78 63 65 70   like FULL excep
22c90 74 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20 73  t that is also s
22ca0 79 6e 63 73 20 74 68 65 20 64 69 72 65 63 74 6f  yncs the directo
22cb0 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ry.**           
22cc0 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73     that contains
22cd0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
22ce0 75 72 6e 61 6c 20 61 66 74 65 72 20 74 68 65 20  urnal after the 
22cf0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20  rollback.**     
22d00 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
22d10 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a   is unlinked..**
22d20 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
22d30 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d   for a rollback-
22d40 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46  journal mode.  F
22d50 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46  or WAL mode, OFF
22d60 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f   continues.** to
22d70 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79   mean that no sy
22d80 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20  ncs ever occur. 
22d90 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68   NORMAL means th
22da0 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79  at the WAL is sy
22db0 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  nced.** prior to
22dc0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68   the start of ch
22dd0 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61  eckpoint and tha
22de0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
22df0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  ile is synced.**
22e00 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
22e10 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  on of the checkp
22e20 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69  oint if the enti
22e30 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  re content of th
22e40 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69  e WAL.** was wri
22e50 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
22e60 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  he database.  Bu
22e70 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74  t no sync operat
22e80 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a  ions occur for.*
22e90 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f  * an ordinary co
22ea0 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d  mmit in NORMAL m
22eb0 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46  ode with WAL.  F
22ec0 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
22ed0 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69  he WAL.** file i
22ee0 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  s synced followi
22ef0 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f  ng each commit o
22f00 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64  peration, in add
22f10 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ition to the.** 
22f20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64  syncs associated
22f30 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54   with NORMAL.  T
22f40 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65  here is no diffe
22f50 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 46 55  rence between FU
22f60 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54 52 41 20  LL.** and EXTRA 
22f70 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a  for WAL mode..**
22f80 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75  .** Do not confu
22f90 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  se synchronous=F
22fa0 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ULL with SQLITE_
22fb0 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a  SYNC_FULL.  The.
22fc0 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  ** SQLITE_SYNC_F
22fd0 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20  ULL macro means 
22fe0 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53  to use the MacOS
22ff0 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79  X-style full-fsy
23000 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74  nc.** using fcnt
23010 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20  l(F_FULLFSYNC). 
23020 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
23030 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  MAL means to do 
23040 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66  an.** ordinary f
23050 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68  sync() call.  Th
23060 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72  ere is no differ
23070 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c  ence between SQL
23080 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a  ITE_SYNC_FULL.**
23090 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43   and SQLITE_SYNC
230a0 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66  _NORMAL on platf
230b0 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20  orms other than 
230c0 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65  MacOSX.  But the
230d0 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  .** synchronous=
230e0 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63  FULL versus sync
230f0 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73  hronous=NORMAL s
23100 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65  etting determine
23110 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53  s when.** the xS
23120 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73  ync primitive is
23130 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72   called and is r
23140 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70  elevant to all p
23150 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  latforms..**.** 
23160 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
23170 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
23180 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
23190 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
231a0 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
231b0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
231c0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
231d0 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
231e0 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
231f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
23200 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
23210 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66  pager to set saf
23220 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f  ety level for */
23230 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
23240 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69  ags      /* Vari
23250 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  ous flags */.){.
23260 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c    unsigned level
23270 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41 47   = pgFlags & PAG
23280 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
23290 41 53 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ASK;.  if( pPage
232a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
232b0 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
232c0 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  c = 1;.    pPage
232d0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b  r->fullSync = 0;
232e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74  .    pPager->ext
232f0 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  raSync = 0;.  }e
23300 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
23310 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
23320 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  ==PAGER_SYNCHRON
23330 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20  OUS_OFF ?1:0;.  
23340 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
23350 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45  nc = level>=PAGE
23360 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55  R_SYNCHRONOUS_FU
23370 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61  LL ?1:0;.    pPa
23380 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d  ger->extraSync =
23390 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59   level==PAGER_SY
233a0 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20  NCHRONOUS_EXTRA 
233b0 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ?1:0;.  }.  if( 
233c0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
233d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
233e0 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ncFlags = 0;.   
233f0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
23400 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65  cFlags = 0;.  }e
23410 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20  lse if( pgFlags 
23420 26 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e  & PAGER_FULLFSYN
23430 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  C ){.    pPager-
23440 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
23450 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
23460 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
23470 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
23480 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
23490 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73  else if( pgFlags
234a0 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55   & PAGER_CKPT_FU
234b0 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70  LLFSYNC ){.    p
234c0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
234d0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
234e0 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
234f0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
23500 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
23510 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
23520 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
23530 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23540 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
23550 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
23560 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23570 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
23580 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
23590 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73  lags = pPager->s
235a0 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  yncFlags;.  if( 
235b0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
235c0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
235d0 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20  walSyncFlags |= 
235e0 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
235f0 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28  TIONS;.  }.  if(
23600 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
23610 5f 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20  _CACHESPILL ){. 
23620 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
23630 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46  Spill &= ~SPILLF
23640 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65  LAG_OFF;.  }else
23650 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
23660 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c  NotSpill |= SPIL
23670 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d  LFLAG_OFF;.  }.}
23680 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
23690 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
236a0 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
236b0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
236c0 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
236d0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
236e0 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
236f0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
23700 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
23710 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
23720 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
23730 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
23740 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
23750 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
23760 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
23770 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
23780 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
23790 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
237a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
237b0 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74  into *pFile. Ret
237c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
237d0 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20   success .** or 
237e0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
237f0 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
23800 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
23810 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
23820 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
23830 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
23840 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
23850 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73  ** The flags pas
23860 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c  sed to the VFS l
23870 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c  ayer xOpen() cal
23880 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63  l are those spec
23890 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61  ified.** by para
238a0 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f  meter vfsFlags O
238b0 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c  Red with the fol
238c0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
238d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
238e0 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53  ADWRITE.**     S
238f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
23900 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
23910 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a  OPEN_EXCLUSIVE.*
23920 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
23930 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a  N_DELETEONCLOSE.
23940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
23950 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
23960 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
23970 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
23980 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
23990 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
239a0 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
239b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
239c0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
239d0 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
239e0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
239f0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
23a00 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
23a10 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
23a20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
23a30 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
23a40 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
23a50 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
23a60 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
23a70 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
23a80 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
23a90 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
23aa0 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
23ab0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
23ac0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
23ad0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
23ae0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
23af0 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
23b00 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
23b10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
23b20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
23b30 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
23b40 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
23b50 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
23b60 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46  _OK || isOpen(pF
23b70 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ile) );.  return
23b80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
23b90 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
23ba0 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  er function..**.
23bb0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76  ** The pager inv
23bc0 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61  okes the busy-ha
23bd0 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33  ndler if sqlite3
23be0 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  OsLock() returns
23bf0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59   .** SQLITE_BUSY
23c00 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
23c10 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d  upgrade from no-
23c20 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44  lock to a SHARED
23c30 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65   lock,.** or whe
23c40 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
23c50 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
23c60 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45  VED lock to an E
23c70 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63  XCLUSIVE .** loc
23c80 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a  k. It does *not*
23c90 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
23ca0 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70   handler when up
23cb0 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20  grading from.** 
23cc0 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
23cd0 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72  ED, or when upgr
23ce0 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45  ading from SHARE
23cf0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a  D to EXCLUSIVE.*
23d00 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20  * (which occurs 
23d10 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e  during hot-journ
23d20 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75  al rollback). Su
23d30 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  mmary:.**.**   T
23d40 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20  ransition       
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d60 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79   | Invokes xBusy
23d70 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d  Handler.**   ---
23d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23db0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  -----.**   NO_LO
23dc0 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52  CK       -> SHAR
23dd0 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59  ED_LOCK      | Y
23de0 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  es.**   SHARED_L
23df0 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45  OCK   -> RESERVE
23e00 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a  D_LOCK    | No.*
23e10 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
23e20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c    -> EXCLUSIVE_L
23e30 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  OCK   | No.**   
23e40 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e  RESERVED_LOCK ->
23e50 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
23e60 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66    | Yes.**.** If
23e70 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
23e80 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  r callback retur
23e90 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
23ea0 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74   lock is .** ret
23eb0 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75  ried. If it retu
23ec0 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  rns zero, then t
23ed0 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  he SQLITE_BUSY e
23ee0 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72  rror is.** retur
23ef0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
23f00 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41  r of the pager A
23f10 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
23f20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23f30 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
23f40 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
23f50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23f60 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
23f70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
23f80 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
23f90 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20  (void *),       
23fa0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
23fb0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
23fc0 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
23fd0 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ff0 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70  /* Argument to p
24000 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64  ass to xBusyHand
24010 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67  ler */.){.  pPag
24020 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
24030 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
24040 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
24050 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
24060 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20  syHandlerArg;.. 
24070 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
24080 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 76  er->fd) ){.    v
24090 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64  oid **ap = (void
240a0 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75   **)&pPager->xBu
240b0 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61  syHandler;.    a
240c0 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28  ssert( ((int(*)(
240d0 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29  void *))(ap[0]))
240e0 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29  ==xBusyHandler )
240f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
24100 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65  [1]==pBusyHandle
24110 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c 69  rArg );.    sqli
24120 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
24130 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
24140 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55   SQLITE_FCNTL_BU
24150 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64  SYHANDLER, (void
24160 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   *)ap);.  }.}../
24170 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
24180 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
24190 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
241a0 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
241b0 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
241c0 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
241d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
241e0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
241f0 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
24200 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
24210 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
24220 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
24230 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
24240 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
24250 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
24260 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
24270 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53  LITE_IOERR, an S
24280 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20  QLITE_IOERR_xxx 
24290 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49  sub-code or SQLI
242a0 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
242b0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
242c0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
242d0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
242e0 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
242f0 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
24300 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
24310 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
24320 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
24330 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
24340 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
24350 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
24360 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
24370 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
24380 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
24390 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
243a0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
243b0 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
243c0 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
243d0 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
243e0 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
243f0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
24400 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
24410 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
24420 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
24430 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
24440 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
24450 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
24460 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
24470 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
24480 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
24490 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
244a0 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
244b0 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
244c0 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
244d0 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
244e0 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
244f0 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
24500 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
24510 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
24520 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
24530 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
24540 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
24550 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
24560 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
24570 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
24580 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
24590 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
245a0 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
245b0 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
245c0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
245d0 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
245e0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
245f0 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
24600 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
24610 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
24620 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
24630 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
24640 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
24650 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
24660 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
24670 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
24680 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
24690 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
246a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
246b0 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
246c0 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61  pPager, u32 *pPa
246d0 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
246e0 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
246f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
24700 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
24710 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75  sible to do a fu
24720 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ll assert_pager_
24730 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73  state() here, as
24740 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
24750 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
24760 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61  d from within Pa
24770 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72  gerOpen(), befor
24780 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
24790 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
247a0 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c  ject is internal
247b0 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  ly consistent.. 
247c0 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20   **.  ** At one 
247d0 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74  point this funct
247e0 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ion returned an 
247f0 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67  error if the pag
24800 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  er was in .  ** 
24810 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
24820 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47  e. But since PAG
24830 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67  ER_ERROR state g
24840 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20  uarantees that. 
24850 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20   ** there is at 
24860 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
24870 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
24880 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74  ence, this funct
24890 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ion.  ** is a no
248a0 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73  -op for that cas
248b0 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a  e anyhow..  */..
248c0 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d    u32 pageSize =
248d0 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
248e0 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
248f0 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
24900 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
24910 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
24920 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
24930 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
24940 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
24950 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73  Size==0).   && s
24960 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
24970 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
24980 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20  ache)==0 .   && 
24990 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
249a0 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65  Size!=(u32)pPage
249b0 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29  r->pageSize .  )
249c0 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
249d0 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
249e0 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70       /* New temp
249f0 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36   space */.    i6
24a00 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20  4 nByte = 0;..  
24a10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
24a20 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20  tate>PAGER_OPEN 
24a30 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
24a40 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72  ->fd) ){.      r
24a50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
24a60 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
24a70 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  , &nByte);.    }
24a80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24a90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24aa0 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
24ab0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
24ac0 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
24ad0 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63    if( !pNew ) rc
24ae0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
24af0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
24b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24b10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
24b20 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
24b30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
24b40 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65  te3PcacheSetPage
24b50 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  Size(pPager->pPC
24b60 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b  ache, pageSize);
24b70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
24b80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24ba0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
24bb0 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
24bc0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
24bd0 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
24be0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
24bf0 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70   (Pgno)((nByte+p
24c00 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53  ageSize-1)/pageS
24c10 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
24c20 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
24c30 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  ageSize;.    }el
24c40 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24c50 33 50 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b  3PageFree(pNew);
24c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
24c70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
24c80 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69  r->pageSize;.  i
24c90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24ca0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73   ){.    if( nRes
24cb0 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
24cc0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
24cd0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
24ce0 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
24cf0 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
24d00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
24d10 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
24d20 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
24d30 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
24d40 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69  er);.    pagerFi
24d50 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72  xMaplimit(pPager
24d60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24d70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
24d80 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24d90 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
24da0 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
24db0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
24dc0 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
24dd0 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
24de0 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
24df0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
24e00 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
24e10 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
24e20 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
24e30 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
24e40 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
24e50 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
24e60 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
24e70 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
24e80 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
24e90 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
24ea0 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
24eb0 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
24ec0 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
24ed0 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
24ee0 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
24ef0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
24f00 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
24f10 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
24f20 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
24f30 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
24f40 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
24f50 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
24f60 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
24f70 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
24f80 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
24f90 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
24fa0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
24fb0 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
24fc0 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
24fd0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
24fe0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
24ff0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
25000 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
25010 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
25020 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
25030 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
25040 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
25050 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
25060 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
25070 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
25080 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
25090 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
250a0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
250b0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
250c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
250d0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20  =PAGER_OPEN );  
250e0 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e      /* Called on
250f0 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e  ly by OP_MaxPgcn
25100 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  t */.  assert( p
25110 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70  Pager->mxPgno>=p
25120 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
25130 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74    /* OP_MaxPgcnt
25140 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a   enforces this *
25150 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  /.  return pPage
25160 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
25170 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
25180 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
25190 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
251a0 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
251b0 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
251c0 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
251d0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
251e0 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
251f0 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
25200 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
25210 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
25220 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
25230 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
25240 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
25250 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
25260 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
25270 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
25280 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
25290 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
252a0 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
252b0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
252c0 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
252d0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
252e0 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
252f0 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
25300 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
25310 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
25320 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
25330 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
25340 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
25350 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
25360 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
25370 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
25380 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
25390 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
253a0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
253b0 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
253c0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
253d0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
253e0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
253f0 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
25400 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
25410 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
25420 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
25430 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
25440 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
25450 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
25460 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
25470 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
25480 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
25490 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
254a0 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
254b0 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29   (zFilename=="")
254c0 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f  , or.** opened o
254d0 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68  n a file less th
254e0 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69  an N bytes in si
254f0 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62  ze, the output b
25500 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f  uffer is.** zero
25510 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
25520 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72   returned. The r
25530 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69  ationale for thi
25540 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a  s is that this .
25550 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ** function is u
25560 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
25570 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e  base headers, an
25580 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e  d a new transien
25590 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a  t or.** zero siz
255a0 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ed database has 
255b0 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f  a header than co
255c0 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
255d0 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a  of zeroes..**.**
255e0 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72   If any IO error
255f0 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49   apart from SQLI
25600 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
25610 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  EAD is encounter
25620 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
25630 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
25640 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
25650 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
25660 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
25670 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e  t buffer undefin
25680 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
25690 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
256a0 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
256b0 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
256c0 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
256d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
256e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
256f0 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
25700 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
25710 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
25720 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
25730 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   );..  /* This r
25740 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
25750 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69  alled by btree i
25760 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
25770 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
25780 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
25790 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20    There has not 
257a0 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e  been an opportun
257b0 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f  ity to transitio
257c0 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f  n.  ** to WAL mo
257d0 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  de yet..  */.  a
257e0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
257f0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
25800 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
25810 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
25820 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
25830 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
25840 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
25850 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
25860 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
25870 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
25880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
25890 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
258a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
258b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
258c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
258d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
258e0 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ion may only be 
258f0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65  called when a re
25900 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
25910 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  s open on.** the
25920 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72   pager. It retur
25930 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ns the total num
25940 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
25950 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
25960 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
25970 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77  the file is betw
25980 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d  een 1 and <page-
25990 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73  size> bytes in s
259a0 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ize, then .** th
259b0 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  is is considered
259c0 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a   a 1 page file..
259d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
259e0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
259f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25a00 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73   *pnPage){.  ass
25a10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
25a20 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
25a30 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
25a40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
25a50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
25a60 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67  SHED );.  *pnPag
25a70 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d  e = (int)pPager-
25a80 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  >dbSize;.}.../*.
25a90 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
25aa0 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
25ab0 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20  locktype on the 
25ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
25ad0 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f  f.** a similar o
25ae0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
25af0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
25b00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25b10 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74   a no-op.** (ret
25b20 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
25b30 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a   immediately)..*
25b40 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
25b50 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
25b60 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  n the lock using
25b70 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
25b80 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65  . Invoke .** the
25b90 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
25ba0 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75  f the lock is cu
25bb0 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
25bc0 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a  lable. Repeat .*
25bd0 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  * until the busy
25be0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
25bf0 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  s false or until
25c00 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
25c10 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c  .** obtain the l
25c20 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
25c30 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
25c40 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
25c50 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
25c60 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
25c70 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
25c80 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69  k. If the lock i
25c90 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65  s obtained succe
25ca0 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65  ssfully, set the
25cb0 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a   Pager.state .**
25cc0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63   variable to loc
25cd0 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74  ktype before ret
25ce0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
25cf0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
25d00 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
25d10 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
25d20 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
25d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d50 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
25d60 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
25d70 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
25d80 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
25d90 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
25da0 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
25db0 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f  eady held), or o
25dc0 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  ne of the transi
25dd0 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
25de0 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
25df0 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
25e00 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
25e10 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
25e20 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
25e30 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
25e40 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
25e50 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
25e60 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70  ->eLock>=locktyp
25e70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
25e80 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
25e90 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
25ea0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
25eb0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
25ec0 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
25ed0 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  D_LOCK && lockty
25ee0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
25ef0 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b  CK).  );..  do {
25f00 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c  .    rc = pagerL
25f10 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f  ockDb(pPager, lo
25f20 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  cktype);.  }whil
25f30 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
25f40 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
25f50 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
25f60 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
25f70 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  rg) );.  return 
25f80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  rc;.}../*.** Fun
25f90 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e  ction assertTrun
25fa0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
25fb0 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68  Pager) checks th
25fc0 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a  at one of the .*
25fd0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  * following is t
25fe0 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74  rue for all dirt
25ff0 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  y pages currentl
26000 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  y in the page-ca
26010 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  che:.**.**   a) 
26020 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
26030 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
26040 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a  equal to the siz
26050 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  e of the .**    
26060 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61    current databa
26070 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67  se image, in pag
26080 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62  es, OR.**.**   b
26090 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f  ) if the page co
260a0 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74  ntent were writt
260b0 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  en at this time,
260c0 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a   it would not.**
260d0 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61        be necessa
260e0 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
260f0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20  current content 
26100 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  out to the sub-j
26110 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28  ournal.**      (
26120 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
26130 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65   function subjRe
26140 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a  quiresPage())..*
26150 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64  *.** If the cond
26160 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62  ition asserted b
26170 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
26180 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
26190 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  nd the.** dirty 
261a0 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20  page were to be 
261b0 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74  discarded from t
261c0 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65  he cache via the
261d0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a   pagerStress().*
261e0 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72  * routine, pager
261f0 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e  Stress() would n
26200 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72  ot write the cur
26210 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
26220 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61  t to.** the data
26230 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20  base file. If a 
26240 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
26250 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65  ction were rolle
26260 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20  d back after.** 
26270 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74  this happened, t
26280 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
26290 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ior would be to 
262a0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
262b0 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
262c0 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
262d0 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
262e0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
262f0 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
26300 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
26310 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
26320 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
26330 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
26340 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
26350 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
26360 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
26370 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
26380 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
26390 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
263a0 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
263b0 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
263c0 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
263d0 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
263e0 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
263f0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
26400 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
26410 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
26420 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26430 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
26440 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
26450 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
26460 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
26470 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
26480 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
26490 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
264a0 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
264b0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
264c0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
264d0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
264e0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
264f0 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
26500 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
26510 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26520 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
26530 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
26540 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26550 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
26560 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
26570 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
26580 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
26590 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
265a0 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
265b0 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
265c0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
265d0 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
265e0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
265f0 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
26600 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
26610 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
26620 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
26630 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
26640 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
26650 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
26660 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
26670 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
26680 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
26690 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67   only called rig
266a0 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
266b0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
266c0 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  on..** Once this
266d0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
266e0 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74  en called, the t
266f0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
26700 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c  either be.** rol
26710 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  led back or comm
26720 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74  itted. It is not
26730 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68   safe to call th
26740 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a  is function and.
26750 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65  ** then continue
26760 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
26770 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69  database..*/.voi
26780 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
26790 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
267a0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
267b0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
267c0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
267d0 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73  >=nPage );.  ass
267e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
267f0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
26800 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
26810 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
26820 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74   nPage;..  /* At
26830 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63   one point the c
26840 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20  ode here called 
26850 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26860 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20  nstraint() to.  
26870 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  ** ensure that a
26880 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74  ll pages being t
26890 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79  runcated away by
268a0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
268b0 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  are,.  ** if one
268c0 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
268d0 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72  nts are open, pr
268e0 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76  esent in the sav
268f0 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75  epoint .  ** jou
26900 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65  rnal so that the
26910 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  y can be restore
26920 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69  d if the savepoi
26930 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a  nt is rolled.  *
26940 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  * back. This is 
26950 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73  no longer necess
26960 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63  ary as this func
26970 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79  tion is now only
26980 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67  .  ** called rig
26990 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
269a0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
269b0 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20  on. So although 
269c0 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20  the .  ** Pager 
269d0 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c  object may still
269e0 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70   have open savep
269f0 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61  oints (Pager.nSa
26a00 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20  vepoint!=0), .  
26a10 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62  ** they cannot b
26a20 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53  e rolled back. S
26a30 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e  o the assertTrun
26a40 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29  cateConstraint()
26a50 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f   call.  ** is no
26a60 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e   longer correct.
26a70 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.}.../*.** Th
26a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
26a90 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74  alled before att
26aa0 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  empting a hot-jo
26ab0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
26ac0 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20  It.** syncs the 
26ad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
26ae0 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20  disk, then sets 
26af0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26b00 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a  dr to the.** siz
26b10 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
26b20 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68   file so that th
26b30 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
26b40 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73  () routine knows
26b50 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74  .** that the ent
26b60 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ire journal file
26b70 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
26b80 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20  ..**.** Syncing 
26b90 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f  a hot-journal to
26ba0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74   disk before att
26bb0 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
26bc0 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20  it back ensures 
26bd0 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f  .** that if a po
26be0 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75  wer-failure occu
26bf0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
26c00 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63  llback, the proc
26c10 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65  ess that.** atte
26c20 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  mpts rollback fo
26c30 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72  llowing system r
26c40 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65  ecovery sees the
26c50 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   same journal.**
26c60 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73   content as this
26c70 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
26c80 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  If everything go
26c90 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53  es as planned, S
26ca0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
26cb0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
26cc0 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
26cd0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
26ce0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79  atic int pagerSy
26cf0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  ncHotJournal(Pag
26d00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
26d10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26d20 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
26d30 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
26d40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
26d50 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
26d60 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
26d70 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  AL);.  }.  if( r
26d80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26d90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26da0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
26db0 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
26dc0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
26dd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26de0 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  ../*.** Obtain a
26df0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
26e00 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  memory mapped pa
26e10 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61  ge object for pa
26e20 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20  ge number pgno. 
26e30 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
26e40 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20  ct will use the 
26e50 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f  pointer pData, o
26e60 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65  btained from xFe
26e70 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63  tch()..** If suc
26e80 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70  cessful, set *pp
26e90 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Page to point to
26ea0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65   the new page re
26eb0 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72  ference.** and r
26ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
26ed0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
26ee0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
26ef0 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a  or code and set.
26f00 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65  ** *ppPage to ze
26f10 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72  ro..**.** Page r
26f20 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e  eferences obtain
26f30 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
26f40 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
26f50 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a  ld be released.*
26f60 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67  * by calling pag
26f70 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
26f80 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
26f90 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  t pagerAcquireMa
26fa0 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  pPage(.  Pager *
26fb0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
26fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
26fd0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
26fe0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27000 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   Page number */.
27010 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20    void *pData,  
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27030 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20    /* xFetch()'d 
27040 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61  data for this pa
27050 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a  ge */.  PgHdr **
27060 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20  ppPage          
27070 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
27080 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62  Acquired page ob
27090 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  ject */.){.  PgH
270a0 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
270c0 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  Memory mapped pa
270d0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ge to return */.
270e0 20 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d    .  if( pPager-
270f0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29  >pMmapFreelist )
27100 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
27110 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  p = pPager->pMma
27120 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70  pFreelist;.    p
27130 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
27140 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  list = p->pDirty
27150 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20  ;.    p->pDirty 
27160 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 0;.    memset(
27170 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50  p->pExtra, 0, pP
27180 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
27190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
271a0 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72  age = p = (PgHdr
271b0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
271c0 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64  Zero(sizeof(PgHd
271d0 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  r) + pPager->nEx
271e0 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  tra);.    if( p=
271f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27200 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
27210 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
27220 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d  gno-1) * pPager-
27230 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61  >pageSize, pData
27240 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
27250 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
27260 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  T;.    }.    p->
27270 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a  pExtra = (void *
27280 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66  )&p[1];.    p->f
27290 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41  lags = PGHDR_MMA
272a0 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  P;.    p->nRef =
272b0 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65   1;.    p->pPage
272c0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a  r = pPager;.  }.
272d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
272e0 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70  xtra==(void *)&p
272f0 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [1] );.  assert(
27300 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a   p->pPage==0 );.
27310 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61    assert( p->fla
27320 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29  gs==PGHDR_MMAP )
27330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
27340 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
27350 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52  .  assert( p->nR
27360 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70  ef==1 );..  p->p
27370 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d  gno = pgno;.  p-
27380 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a  >pData = pData;.
27390 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
273a0 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ut++;..  return 
273b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
273c0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
273d0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
273e0 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61  pPg. pPg must ha
273f0 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64  ve been returned
27400 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69   by an .** earli
27410 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  er call to pager
27420 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29  AcquireMapPage()
27430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27440 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
27450 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
27460 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
27470 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
27480 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
27490 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44  Out--;.  pPg->pD
274a0 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
274b0 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
274c0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
274d0 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20  elist = pPg;..  
274e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
274f0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
27500 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73  ersion>=3 );.  s
27510 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
27520 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
27530 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70  )(pPg->pgno-1)*p
27540 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
27550 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a   pPg->pData);.}.
27560 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
27570 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74  PgHdr objects st
27580 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65  ored in the Page
27590 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  r.pMmapFreelist 
275a0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
275b0 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61  void pagerFreeMa
275c0 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61  pHdrs(Pager *pPa
275d0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
275e0 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  ;.  PgHdr *pNext
275f0 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
27600 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27610 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
27620 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69    pNext = p->pDi
27630 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rty;.    sqlite3
27640 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
27650 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
27660 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
27670 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
27680 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
27690 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
276a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
276b0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
276c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
276d0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
276e0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
276f0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
27700 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
27710 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
27720 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
27730 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
27740 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
27750 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
27760 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
27770 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
27780 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
27790 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
277a0 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
277b0 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
277c0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
277d0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
277e0 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
277f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
27800 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
27810 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
27820 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
27830 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
27840 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
27850 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
27860 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
27870 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
27880 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
27890 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
278a0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
278b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
278c0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
278d0 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  er){.  u8 *pTmp 
278e0 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
278f0 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73  pTmpSpace;..  as
27900 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
27910 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
27920 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69   );.  disable_si
27930 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
27940 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
27950 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
27960 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61  );.  pagerFreeMa
27970 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20  pHdrs(pPager);. 
27980 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43   /* pPager->errC
27990 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ode = 0; */.  pP
279a0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
279b0 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
279c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
279d0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f  .  sqlite3WalClo
279e0 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  se(pPager->pWal,
279f0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
27a00 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e  cFlags, pPager->
27a10 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b  pageSize, pTmp);
27a20 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  .  pPager->pWal 
27a30 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61  = 0;.#endif.  pa
27a40 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
27a50 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
27a60 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
27a70 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
27a80 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69  lse{.    /* If i
27a90 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20  t is open, sync 
27aa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27ab0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
27ac0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
27ad0 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  k..    ** If thi
27ae0 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74  s is not done, t
27af0 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20  hen an unsynced 
27b00 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  portion of the o
27b10 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20  pen journal .   
27b20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20   ** file may be 
27b30 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f  played back into
27b40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
27b50 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
27b60 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a  e occurs .    **
27b70 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68   while this is h
27b80 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
27b90 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63  tabase could bec
27ba0 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20  ome corrupt..   
27bb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e   **.    ** If an
27bc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
27bd0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79  ile trying to sy
27be0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  nc the journal, 
27bf0 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a  shift the pager.
27c00 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
27c10 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69  ERROR state. Thi
27c20 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41  s causes UnlockA
27c30 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e  ndRollback to un
27c40 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20  lock the.    ** 
27c50 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f  database and clo
27c60 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
27c70 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65  ile without atte
27c80 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
27c90 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72  t.    ** back or
27ca0 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68   finalize it. Th
27cb0 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20  e next database 
27cc0 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74  user will have t
27cd0 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  o do hot-journal
27ce0 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
27cf0 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e   before accessin
27d00 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
27d10 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
27d20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
27d30 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
27d40 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
27d50 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f  ger, pagerSyncHo
27d60 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
27d70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
27d80 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
27d90 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
27da0 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
27db0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65  ignMalloc();.  e
27dc0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
27dd0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50  io_errors();.  P
27de0 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53  AGERTRACE(("CLOS
27df0 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
27e00 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f  (pPager)));.  IO
27e10 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
27e20 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
27e30 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
27e40 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73  Pager->jfd);.  s
27e50 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
27e60 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c  ager->fd);.  sql
27e70 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d  ite3PageFree(pTm
27e80 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  p);.  sqlite3Pca
27e90 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  cheClose(pPager-
27ea0 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64  >pPCache);..#ifd
27eb0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
27ec0 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72  DEC.  if( pPager
27ed0 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70  ->xCodecFree ) p
27ee0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
27ef0 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  e(pPager->pCodec
27f00 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
27f10 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53  ert( !pPager->aS
27f20 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61  avepoint && !pPa
27f30 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
27f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
27f50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27f60 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
27f70 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20  ger->sjfd) );.. 
27f80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
27f90 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
27fa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
27fb0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
27fc0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
27fd0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
27fe0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
27ff0 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65   number for page
28000 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71   pPg..*/.Pgno sq
28010 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
28020 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67  mber(DbPage *pPg
28030 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
28040 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
28050 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
28060 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
28070 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  ount for page pP
28080 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
28090 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
280a0 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  e *pPg){.  sqlit
280b0 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29  e3PcacheRef(pPg)
280c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
280d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  the journal. In 
280e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
280f0 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
28100 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
28110 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
28120 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
28130 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
28140 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
28150 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  of the.** disk a
28160 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  nd can be restor
28170 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
28180 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
28190 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
281a0 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f   If the Pager.no
281b0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
281c0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
281d0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
281e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
281f0 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
28200 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
28210 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61  e journal-mode a
28220 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63  nd the .** devic
28230 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
28240 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  s of the file-sy
28250 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
28260 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
28270 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28280 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
28290 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
282a0 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
282b0 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
282c0 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
282d0 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
282e0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
282f0 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
28300 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
28310 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
28320 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
28330 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
28340 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
28350 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
28360 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
28370 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
28380 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
28390 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
283a0 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
283b0 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
283c0 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
283d0 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
283e0 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
283f0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
28400 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
28410 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
28420 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
28430 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
28440 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
28450 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
28460 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
28470 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
28480 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
28490 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
284a0 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
284b0 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
284c0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
284d0 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
284e0 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
284f0 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
28500 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
28510 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
28520 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
28530 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
28540 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
28550 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
28560 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
28570 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
28580 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
28590 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
285a0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
285b0 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
285c0 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
285d0 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
285e0 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
285f0 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
28600 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
28610 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
28620 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
28630 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
28640 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
28650 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
28660 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
28670 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
28680 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
28690 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69  int newHdr){.  i
286a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
286c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
286d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
286e0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
286f0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
28700 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
28710 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
28720 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
28730 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
28740 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
28750 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
28760 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
28770 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
28780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28790 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
287a0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66  pPager, 0);.  if
287b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
287c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
287d0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
287e0 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
287f0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
28800 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
28810 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
28820 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
28830 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
28840 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
28850 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f  MORY ){.      co
28860 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71  nst int iDc = sq
28870 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
28880 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
28890 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
288a0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
288b0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
288c0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
288d0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
288e0 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
288f0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
28900 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
28910 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
28920 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
28930 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
28940 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
28950 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
28960 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
28970 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
28980 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
28990 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
289a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
289b0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
289c0 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
289d0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
289e0 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
289f0 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
28a00 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
28a10 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
28a20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
28a30 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
28a40 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
28a50 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
28a60 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
28a70 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
28a80 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  's transaction),
28a90 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20   and a crash or 
28aa0 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20  power-failure . 
28ab0 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73         ** occurs
28ac0 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75   after nRec is u
28ad0 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  pdated but befor
28ae0 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
28af0 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20  n writes .      
28b00 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c    ** anything el
28b10 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  se to the journa
28b20 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69  l file (or commi
28b30 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74  ts/rolls back it
28b40 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  s .        ** tr
28b50 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e  ansaction), then
28b60 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f   SQLite may beco
28b70 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e  me confused when
28b80 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20   doing the .    
28b90 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
28ba0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  al rollback foll
28bb0 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20  owing recovery. 
28bc0 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b  It may roll back
28bd0 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
28be0 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
28bf0 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70  ons data, then p
28c00 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e  roceed to rollin
28c10 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a  g back the old,.
28c20 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f          ** out-o
28c30 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74  f-date data that
28c40 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74   follows it. Dat
28c50 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
28c60 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28c70 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20       ** To work 
28c80 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
28c90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28ca0 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20   does appear to 
28cb0 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20  contain.        
28cc0 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65  ** a valid heade
28cd0 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65  r following Page
28ce0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68  r.journalOff, th
28cf0 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a  en write a 0x00.
28d00 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20          ** byte 
28d10 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
28d20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  it to prevent it
28d30 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f   from being reco
28d40 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20  gnized..        
28d50 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61  **.        ** Va
28d60 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f  riable iNextHdrO
28d70 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20  ffset is set to 
28d80 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68  the offset at wh
28d90 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20  ich this.       
28da0 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20   ** problematic 
28db0 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75  header will occu
28dc0 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  r, if it exists.
28dd0 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20   aMagic is used 
28de0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61  .        ** as a
28df0 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
28e00 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65  r to inspect the
28e10 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66   first couple of
28e20 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20   bytes of.      
28e30 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69    ** the potenti
28e40 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  al journal heade
28e50 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
28e60 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48        i64 iNextH
28e70 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  drOffset;.      
28e80 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a    u8 aMagic[8];.
28e90 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64          u8 zHead
28ea0 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
28eb0 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20  alMagic)+4];..  
28ec0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65        memcpy(zHe
28ed0 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
28ee0 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
28ef0 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
28f00 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26       put32bits(&
28f10 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
28f20 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
28f30 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
28f40 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
28f50 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
28f60 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
28f70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
28f80 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
28f90 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
28fa0 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
28fb0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
28fc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28fd0 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
28fe0 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
28ff0 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
29000 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
29010 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
29020 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
29030 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
29040 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
29050 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
29060 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
29070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
29080 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29090 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
290a0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
290b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
290c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
290d0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
290e0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
290f0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
29100 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
29110 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
29120 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
29130 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
29140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
29150 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
29160 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
29170 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
29180 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
29190 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
291a0 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
291b0 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
291c0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
291d0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
291e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
291f0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
29200 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
29210 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
29220 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
29230 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
29240 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
29250 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
29260 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
29270 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
29280 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
29290 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
292a0 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
292b0 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
292c0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
292d0 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
292e0 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
292f0 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
29300 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
29310 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
29320 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
29330 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29340 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
29350 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
29360 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
29370 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
29380 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
29390 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
293a0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
293b0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
293c0 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
293d0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
293e0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
293f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29400 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
29410 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
29420 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
29430 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29440 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29460 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
29470 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
29480 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
29490 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20  rnalHdr));.     
294a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
294b0 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  sWrite(.        
294c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c      pPager->jfd,
294d0 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
294e0 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65  (zHeader), pPage
294f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20  r->journalHdr.  
29500 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29510 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29520 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29540 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
29550 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
29560 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
29570 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
29580 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
29590 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
295a0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
295b0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
295c0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
295d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
295e0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
295f0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
29600 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  cFlags| .       
29610 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
29620 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  Flags==SQLITE_SY
29630 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
29640 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
29650 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
29660 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29670 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29680 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
29690 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
296a0 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
296b0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20  urnalOff;.      
296c0 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d  if( newHdr && 0=
296d0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
296e0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
296f0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
29700 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
29710 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
29720 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
29730 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29740 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
29750 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29760 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
29770 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
29780 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
29790 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
297a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65  }.  }..  /* Unle
297b0 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
297c0 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20  in noSync mode, 
297d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
297e0 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20   was just .  ** 
297f0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e  successfully syn
29800 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ced. Either way,
29810 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
29820 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
29830 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67  on .  ** all pag
29840 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
29850 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e  e3PcacheClearSyn
29860 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  cFlags(pPager->p
29870 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65  PCache);.  pPage
29880 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
29890 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a  R_WRITER_DBMOD;.
298a0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
298b0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
298c0 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
298d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
298e0 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
298f0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  t is the first i
29900 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
29910 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63  of dirty pages c
29920 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74  onnected.** by t
29930 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
29940 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75  pointer. This fu
29950 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61  nction writes ea
29960 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  ch one of the.**
29970 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
29980 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20   in the list to 
29990 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
299a0 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
299b0 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20  may.** be NULL, 
299c0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
299d0 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74  empty list. In t
299e0 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
299f0 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e  nction is.** a n
29a00 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
29a10 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  pager must hold 
29a20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
29a30 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68  VED lock when th
29a40 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
29a50 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65  s called. Before
29a60 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e   writing anythin
29a70 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
29a80 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63  e file, this loc
29a90 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64  k.** is upgraded
29aa0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
29ab0 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
29ac0 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
29ad0 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  ained,.** SQLITE
29ae0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
29af0 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73  d and no data is
29b00 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
29b10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
29b20 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
29b30 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  er is a temp-fil
29b40 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20  e pager and the 
29b50 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74  actual file-syst
29b60 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f  em file.** is no
29b70 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69  t yet open, it i
29b80 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70  s created and op
29b90 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ened before any 
29ba0 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74  data is .** writ
29bb0 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ten out..**.** O
29bc0 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  nce the lock has
29bd0 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61   been upgraded a
29be0 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
29bf0 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  , the file opene
29c00 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  d,.** the pages 
29c10 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20  are written out 
29c20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
29c30 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64  file in list ord
29c40 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61  er. Writing.** a
29c50 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64   page is skipped
29c60 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74   if it meets eit
29c70 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
29c80 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a  wing criteria:.*
29c90 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
29ca0 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  e number is grea
29cb0 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64  ter than Pager.d
29cc0 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a  bSize, or.**   *
29cd0 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   The PGHDR_DONT_
29ce0 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65  WRITE flag is se
29cf0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
29d00 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20  *.** If writing 
29d10 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65  out a page cause
29d20 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
29d30 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67  ile to grow, Pag
29d40 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  er.dbFileSize.**
29d50 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f   is updated acco
29d60 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65  rdingly. If page
29d70 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75   1 is written ou
29d80 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
29d90 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50  e cached.** in P
29da0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
29db0 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  ] is updated to 
29dc0 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61  match the new va
29dd0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
29de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29df0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
29e00 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
29e10 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
29e20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
29e30 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
29e40 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
29e50 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
29e60 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
29e70 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
29e80 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62   cannot.** be ob
29e90 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42  tained, SQLITE_B
29ea0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
29eb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
29ec0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
29ed0 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ist(Pager *pPage
29ee0 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29  r, PgHdr *pList)
29ef0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
29f00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
29f10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
29f20 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
29f30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
29f40 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  s only called fo
29f50 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72  r rollback pager
29f60 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f  s in WRITER_DBMO
29f70 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73  D state. */.  as
29f80 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
29f90 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
29fa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29fb0 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70 50 61 67  tempFile || pPag
29fc0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
29fd0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
29fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29ff0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
2a000 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  SIVE_LOCK );.  a
2a010 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2a020 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 4c 69  ager->fd) || pLi
2a030 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 29 3b  st->pDirty==0 );
2a040 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
2a050 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
2a060 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
2a070 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
2a080 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
2a090 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
2a0a0 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
2a0b0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
2a0c0 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
2a0d0 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
2a0e0 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
2a0f0 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
2a100 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
2a110 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
2a120 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2a130 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
2a140 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2a150 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
2a160 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
2a170 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
2a180 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
2a190 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2a1a0 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  s);.  }..  /* Be
2a1b0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
2a1c0 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
2a1d0 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
2a1e0 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
2a1f0 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
2a200 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  be..  */.  asser
2a210 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2a220 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
2a230 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20  r->fd) );.  if( 
2a240 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
2a250 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48    && pPager->dbH
2a260 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  intSize<pPager->
2a270 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c  dbSize.   && (pL
2a280 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70  ist->pDirty || p
2a290 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  List->pgno>pPage
2a2a0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20  r->dbHintSize). 
2a2b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2a2c0 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70  int64 szFile = p
2a2d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
2a2e0 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  * (sqlite3_int64
2a2f0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
2a300 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
2a310 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
2a320 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
2a330 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
2a340 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20  , &szFile);.    
2a350 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
2a360 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
2a370 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ize;.  }..  whil
2a380 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2a390 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
2a3a0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69   Pgno pgno = pLi
2a3b0 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f  st->pgno;..    /
2a3c0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
2a3d0 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
2a3e0 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
2a3f0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
2a400 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
2a410 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
2a420 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
2a430 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
2a440 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Image() was call
2a450 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
2a460 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
2a470 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
2a480 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
2a490 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
2a4a0 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
2a4b0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
2a4c0 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
2a4d0 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20  ** Also, do not 
2a4e0 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61  write out any pa
2a4f0 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ge that has the 
2a500 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2a510 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74   flag.    ** set
2a520 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33   (set by sqlite3
2a530 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
2a540 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
2a550 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
2a560 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
2a570 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
2a580 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
2a590 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2a5a0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
2a5b0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
2a5c0 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  e;   /* Offset t
2a5d0 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  o write */.     
2a5e0 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20   char *pData;   
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65  /* Data to write
2a620 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61   */    ..      a
2a630 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66  ssert( (pList->f
2a640 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2a650 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
2a660 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
2a670 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
2a680 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
2a690 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20  (pList);..      
2a6a0 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61  /* Encode the da
2a6b0 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
2a6c0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
2a6d0 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e  List->pData, pgn
2a6e0 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 6, return SQL
2a6f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
2a700 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  pData);..      /
2a710 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20  * Write out the 
2a720 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20  page data. */.  
2a730 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a740 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2a750 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
2a760 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2a770 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
2a780 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75  If page 1 was ju
2a790 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  st written, upda
2a7a0 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  te Pager.dbFileV
2a7b0 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20  ers to match.   
2a7c0 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
2a7d0 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68  now stored in th
2a7e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a7f0 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73   If writing this
2a800 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20   .      ** page 
2a810 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62  caused the datab
2a820 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
2a830 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53  , update dbFileS
2a840 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ize. .      */. 
2a850 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31       if( pgno==1
2a860 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
2a870 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
2a880 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
2a890 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
2a8a0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
2a8b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a8c0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
2a8d0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
2a8e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2a8f0 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
2a900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2a910 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
2a920 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b  ER_STAT_WRITE]++
2a930 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
2a940 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
2a950 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
2a960 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2a970 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
2a980 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
2a990 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
2a9a0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
2a9b0 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
2a9c0 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
2a9d0 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
2a9e0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
2a9f0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
2aa00 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
2aa10 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
2aa20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2aa30 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
2aa40 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
2aa50 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2aa60 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
2aa70 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
2aa80 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
2aa90 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73  count);.    }els
2aaa0 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
2aab0 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
2aac0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2aad0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
2aae0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
2aaf0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
2ab00 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  sh(pList);.    p
2ab10 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
2ab20 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
2ab30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ab40 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
2ab50 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
2ab60 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74  e is open. If it
2ab70 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2ab80 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
2ab90 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2aba0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2abb0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
2abc0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
2abd0 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
2abe0 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  . An .** SQLITE_
2abf0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
2ac00 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2ac10 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   if a call to sq
2ac20 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a  lite3OsOpen() .*
2ac30 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
2ac40 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
2ac50 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2ac60 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2ac70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2ac80 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2ac90 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 63  ->sjfd) ){.    c
2aca0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
2acb0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55    SQLITE_OPEN_SU
2acc0 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51 4c 49 54  BJOURNAL | SQLIT
2acd0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2ace0 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45   .      | SQLITE
2acf0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
2ad00 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
2ad10 53 49 56 45 20 0a 20 20 20 20 20 20 7c 20 53 51  SIVE .      | SQ
2ad20 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
2ad30 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 69 6e 74  ONCLOSE;.    int
2ad40 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 73 71   nStmtSpill = sq
2ad50 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d  lite3Config.nStm
2ad60 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69 66 28 20  tSpill;.    if( 
2ad70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2ad80 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2ad90 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c  ALMODE_MEMORY ||
2ada0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
2adb0 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 6e  emory ){.      n
2adc0 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d 31 3b 0a  StmtSpill = -1;.
2add0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
2ade0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
2adf0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
2ae00 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  0, pPager->sjfd,
2ae10 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74 53 70 69   flags, nStmtSpi
2ae20 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ll);.  }.  retur
2ae30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2ae40 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
2ae50 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
2ae60 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
2ae70 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2ae80 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  al. .**.** If su
2ae90 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
2aea0 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
2aeb0 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
2aec0 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
2aed0 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
2aee0 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
2aef0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2af00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2af10 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2af20 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
2af30 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
2af40 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
2af50 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
2af60 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
2af70 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2af80 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
2af90 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
2afa0 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
2afb0 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
2afc0 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
2afd0 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
2afe0 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
2aff0 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
2b000 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
2b010 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
2b020 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2b030 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
2b040 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2b050 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2b060 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20  LMODE_OFF ){..  
2b070 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
2b080 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
2b090 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
2b0a0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a   been opened */.
2b0b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b0c0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2b0d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2b0e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2b0f0 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  ) || pagerUseWal
2b100 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2b110 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2b120 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20  Pager->sjfd) || 
2b130 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d  pPager->nSubRec=
2b140 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2b150 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2b160 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20  ager) .         
2b170 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  || pageInJournal
2b180 28 70 50 61 67 65 72 2c 20 70 50 67 29 20 0a 20  (pPager, pPg) . 
2b190 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e          || pPg->
2b1a0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
2b1b0 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a  rigSize .    );.
2b1c0 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
2b1d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2b1e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2b1f0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  sub-journal was 
2b200 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66 75  opened successfu
2b210 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65  lly (or was alre
2b220 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a  ady open),.    *
2b230 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72  * write the jour
2b240 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  nal record into 
2b250 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  the file.  */.  
2b260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69  _OK ){.      voi
2b280 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
2b290 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34  pData;.      i64
2b2a0 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70   offset = (i64)p
2b2b0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28  Pager->nSubRec*(
2b2c0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
2b2d0 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ze);.      char 
2b2e0 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20  *pData2;.  .    
2b2f0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2b300 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
2b310 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
2b320 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
2b330 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50  pData2);.      P
2b340 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54  AGERTRACE(("STMT
2b350 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
2b360 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2b370 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2b380 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  no));.      rc =
2b390 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
2b3a0 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65  ger->sjfd, offse
2b3b0 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
2b3c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2b3d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b3e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2b3f0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  Write(pPager->sj
2b400 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
2b410 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
2b420 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d  fset+4);.      }
2b430 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2b440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b450 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
2b460 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
2b470 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
2b480 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
2b490 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
2b4a0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
2b4b0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
2b4c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b4d0 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  .}.static int su
2b4e0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65  bjournalPageIfRe
2b4f0 71 75 69 72 65 64 28 50 67 48 64 72 20 2a 70 50  quired(PgHdr *pP
2b500 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65  g){.  if( subjRe
2b510 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
2b520 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75  ){.    return su
2b530 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
2b540 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b560 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2b570 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b580 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63  called by the pc
2b590 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20  ache layer when 
2b5a0 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73  it has reached s
2b5b0 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f  ome.** soft memo
2b5c0 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69  ry limit. The fi
2b5d0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
2b5e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
2b5f0 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  ager object.** (
2b600 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29  cast as a void*)
2b610 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61  . The pager is a
2b620 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65  lways 'purgeable
2b630 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  ' (not an in-mem
2b640 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29  ory.** database)
2b650 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
2b660 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72  ument is a refer
2b670 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74  ence to a page t
2b680 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65  hat is .** curre
2b690 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68  ntly dirty but h
2b6a0 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
2b6b0 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68  g references. Th
2b6c0 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77  e page.** is alw
2b6d0 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ays associated w
2b6e0 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62  ith the Pager ob
2b6f0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
2b700 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67  he first .** arg
2b710 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ument..**.** The
2b720 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e   job of this fun
2b730 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65  ction is to make
2b740 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72   pPg clean by wr
2b750 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e  iting its conten
2b760 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65  ts.** out to the
2b770 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2b780 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69  if possible. Thi
2b790 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79  s may involve sy
2b7a0 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncing the.** jou
2b7b0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rnal file. .**.*
2b7c0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2b7d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2b7e0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c  keClean() is cal
2b7f0 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20  led on the page 
2b800 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
2b810 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2b820 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2b830 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
2b840 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67   make the.** pag
2b850 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20  e clean, the IO 
2b860 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2b870 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70  turned. If the p
2b880 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  age cannot be.**
2b890 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20   made clean for 
2b8a0 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f  some other reaso
2b8b0 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  n, but no error 
2b8c0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
2b8d0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
2b8e0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
2b8f0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2b900 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e  ) is not called.
2b910 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2b920 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20  agerStress(void 
2b930 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  *p, PgHdr *pPg){
2b940 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2b950 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20   = (Pager *)p;. 
2b960 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b970 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
2b980 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
2b990 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
2b9a0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2b9b0 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a  R_DIRTY );..  /*
2b9c0 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2b9d0 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
2b9e0 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
2b9f0 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
2ba00 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
2ba10 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
2ba20 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
2ba30 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
2ba40 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
2ba50 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
2ba60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2ba70 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
2ba80 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
2ba90 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
2baa0 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
2bab0 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
2bac0 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
2bad0 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  ill ROLLBACK and
2bae0 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69   OFF bits inhibi
2baf0 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69  ts all cache spi
2bb00 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72  lling.  ** regar
2bb10 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2bb20 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69   or not a sync i
2bb30 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69  s required.  Thi
2bb40 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a  s is set during.
2bb50 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
2bb60 6f 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65  or by user reque
2bb70 73 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  st, respectively
2bb80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c  ..  **.  ** Spil
2bb90 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f  ling is also pro
2bba0 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20  hibited when in 
2bbb0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73  an error state s
2bbc0 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a  ince that could.
2bbd0 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74    ** lead to dat
2bbe0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
2bbf0 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65  .   In the curre
2bc00 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
2bc10 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d  n it .  ** is im
2bc20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c  possible for sql
2bc30 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
2bc40 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77  ) to be called w
2bc50 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
2bc60 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20  3.  ** while in 
2bc70 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
2bc80 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70   hence it is imp
2bc90 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
2bca0 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a   routine to.  **
2bcb0 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68   be called in th
2bcc0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20  e error state.  
2bcd0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65  Nevertheless, we
2bce0 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52   include a NEVER
2bcf0 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72  ().  ** test for
2bd00 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2bd10 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20   as a safeguard 
2bd20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63  against future c
2bd30 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  hanges..  */.  i
2bd40 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2bd50 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
2bd60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2bd70 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2bd80 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2bd90 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2bda0 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  K );.  testcase(
2bdb0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2bdc0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2bdd0 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73  OFF );.  testcas
2bde0 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2bdf0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2be00 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66  G_NOSYNC );.  if
2be10 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2be20 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61  pill.   && ((pPa
2be30 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2be40 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  & (SPILLFLAG_ROL
2be50 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f  LBACK|SPILLFLAG_
2be60 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c  OFF))!=0.      |
2be70 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  | (pPg->flags & 
2be80 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2be90 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  !=0).  ){.    re
2bea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2beb0 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72    }..  pPg->pDir
2bec0 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61  ty = 0;.  if( pa
2bed0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2bee0 29 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ) ){.#ifndef SQL
2bef0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
2bf00 45 4e 54 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ENT.    /* If th
2bf10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2bf20 20 61 20 22 42 45 47 49 4e 20 43 4f 4e 43 55 52   a "BEGIN CONCUR
2bf30 52 45 4e 54 22 20 74 72 61 6e 73 61 63 74 69 6f  RENT" transactio
2bf40 6e 2c 20 74 68 65 20 70 61 67 65 20 0a 20 20 20  n, the page .   
2bf50 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6c   ** cannot be fl
2bf60 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 52  ushed to disk. R
2bf70 65 74 75 72 6e 20 65 61 72 6c 79 20 69 6e 20 74  eturn early in t
2bf80 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  his case. */.   
2bf90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
2bfa0 6c 52 65 61 64 20 29 20 72 65 74 75 72 6e 20 53  lRead ) return S
2bfb0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
2bfc0 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
2bfd0 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f   single frame fo
2bfe0 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74  r this page to t
2bff0 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72  he log. */.    r
2c000 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
2c010 67 65 49 66 52 65 71 75 69 72 65 64 28 70 50 67  geIfRequired(pPg
2c020 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ); .    if( rc==
2c030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c040 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
2c050 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
2c060 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Pg, 0, 0);.    }
2c070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
2c080 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
2c090 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71  rnal file if req
2c0a0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  uired. */.    if
2c0b0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2c0c0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20  DR_NEED_SYNC .  
2c0d0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
2c0e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2c0f0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
2c100 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
2c110 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
2c120 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 1);.    }.  . 
2c130 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
2c140 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2c150 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
2c160 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2c170 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2c180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c190 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
2c1a0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2c1b0 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
2c1c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
2c1d0 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67  te_pagelist(pPag
2c1e0 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a  er, pPg);.    }.
2c1f0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
2c200 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
2c210 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2c220 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c230 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
2c240 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
2c250 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2c260 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
2c270 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2c280 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
2c290 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2c2a0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
2c2b0 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a  er, rc); .}../*.
2c2c0 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72  ** Flush all unr
2c2d0 65 66 65 72 65 6e 63 65 64 20 64 69 72 74 79 20  eferenced dirty 
2c2e0 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a  pages to disk..*
2c2f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2c300 65 72 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70  erFlush(Pager *p
2c310 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2c320 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
2c330 64 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  de;.  if( !MEMDB
2c340 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
2c350 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
2c360 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
2c370 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2c380 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
2c390 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
2c3a0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68  Pager) );.    wh
2c3b0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2c3c0 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
2c3d0 20 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78       PgHdr *pNex
2c3e0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
2c3f0 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  y;.      if( pLi
2c400 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  st->nRef==0 ){. 
2c410 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2c420 72 53 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70  rStress((void*)p
2c430 50 61 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20  Pager, pList);. 
2c440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69       }.      pLi
2c450 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20  st = pNext;.    
2c460 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2c470 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
2c480 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
2c490 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
2c4a0 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
2c4b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
2c4c0 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
2c4d0 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
2c4e0 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
2c4f0 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
2c500 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
2c510 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
2c520 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
2c530 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
2c540 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
2c550 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
2c560 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
2c570 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
2c580 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
2c590 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
2c5a0 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
2c5b0 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
2c5c0 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
2c5d0 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
2c5e0 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
2c5f0 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
2c600 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
2c610 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
2c620 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
2c630 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
2c640 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2c650 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
2c660 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
2c670 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
2c680 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
2c690 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
2c6a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2c6b0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
2c6c0 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
2c6d0 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
2c6e0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2c6f0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
2c700 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
2c710 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
2c720 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
2c730 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
2c740 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
2c750 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2c760 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
2c770 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
2c780 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
2c790 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
2c7a0 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
2c7b0 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
2c7c0 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
2c7d0 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
2c7e0 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
2c7f0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
2c800 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20   of the PAGER_* 
2c810 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
2c820 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
2c830 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
2c840 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
2c850 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
2c860 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
2c870 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
2c880 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
2c890 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
2c8a0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
2c8b0 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
2c8c0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
2c8d0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
2c8e0 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
2c8f0 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
2c900 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
2c910 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
2c920 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
2c930 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
2c940 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
2c950 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
2c960 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
2c970 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
2c980 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
2c990 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
2c9a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2c9b0 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
2c9c0 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
2c9d0 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
2c9e0 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
2c9f0 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
2ca00 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
2ca10 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
2ca20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2ca30 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2ca40 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
2ca50 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
2ca60 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
2ca70 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
2ca80 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
2ca90 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
2caa0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2cab0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
2cac0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2cad0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2cae0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2caf0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2cb00 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
2cb10 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
2cb20 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
2cb30 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
2cb40 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
2cb50 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2cb60 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
2cb70 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
2cb80 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
2cb90 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
2cba0 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
2cbb0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
2cbc0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
2cbd0 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
2cbe0 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
2cbf0 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
2cc00 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
2cc10 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
2cc20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2cc30 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
2cc40 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
2cc50 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
2cc60 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2cc70 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
2cc80 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2cc90 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
2cca0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2ccb0 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
2ccc0 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
2ccd0 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
2cce0 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
2ccf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2cd00 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
2cd10 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
2cd20 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
2cd30 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2cd40 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2cd50 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
2cd60 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  */.  int journal
2cd70 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  FileSize;     /*
2cd80 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2cd90 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  te for each jour
2cda0 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72  nal fd */.  char
2cdb0 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b   *zPathname = 0;
2cdc0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
2cdd0 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
2cde0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  le */.  int nPat
2cdf0 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  hname = 0;      
2ce00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2ce10 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65  tes in zPathname
2ce20 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
2ce30 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
2ce40 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
2ce50 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65  AL)==0; /* False
2ce60 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c   to omit journal
2ce70 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
2ce80 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
2ce90 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
2cea0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2ceb0 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
2cec0 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67  e */.  u32 szPag
2ced0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
2cee0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2cef0 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
2cf00 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e  ge size */.  con
2cf10 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20  st char *zUri = 
2cf20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67  0;    /* URI arg
2cf30 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
2cf40 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20  nt nUri = 0;    
2cf50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2cf60 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52  r of bytes of UR
2cf70 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20  I args at *zUri 
2cf80 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
2cf90 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
2cfa0 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
2cfb0 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2cfc0 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
2cfd0 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
2cfe0 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
2cff0 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
2d000 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
2d010 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c   */.  journalFil
2d020 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
2d030 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
2d040 65 28 70 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20  e(pVfs));..  /* 
2d050 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
2d060 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
2d070 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
2d080 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
2d090 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66  pPager = 0;..#if
2d0a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d0b0 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20  _MEMORYDB.  if( 
2d0c0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45  flags & PAGER_ME
2d0d0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44  MORY ){.    memD
2d0e0 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a  b = 1;.    if( z
2d0f0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2d100 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2d110 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2d120 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
2d130 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2d140 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2d150 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51  ==0  ) return SQ
2d160 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2d170 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  .      nPathname
2d180 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2d190 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2d1a0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d       zFilename =
2d1b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   0;.    }.  }.#e
2d1c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  ndif..  /* Compu
2d1d0 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
2d1e0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
2d1f0 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
2d200 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
2d210 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
2d220 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
2d230 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
2d240 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
2d250 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
2d260 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
2d270 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
2d280 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
2d290 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2d2a0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2d2b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2d2c0 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  *z;.    nPathnam
2d2d0 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
2d2e0 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
2d2f0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2d300 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50  bMallocRaw(0, nP
2d310 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
2d320 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2d330 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2d340 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2d350 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50  PT;.    }.    zP
2d360 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
2d370 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
2d380 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
2d390 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
2d3a0 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20  fails */.    rc 
2d3b0 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
2d3c0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
2d3d0 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
2d3e0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
2d3f0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2d400 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2d410 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2d420 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c  z = zUri = &zFil
2d430 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  ename[sqlite3Str
2d440 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
2d450 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
2d460 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d  *z ){.      z +=
2d470 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2d480 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b  (z)+1;.      z +
2d490 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2d4a0 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  0(z)+1;.    }.  
2d4b0 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26    nUri = (int)(&
2d4c0 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20  z[1] - zUri);.  
2d4d0 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d    assert( nUri>=
2d4e0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
2d4f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
2d500 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
2d510 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
2d520 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2d530 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
2d540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
2d550 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
2d560 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2d570 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
2d580 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
2d590 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
2d5a0 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
2d5b0 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
2d5c0 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
2d5d0 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
2d5e0 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
2d5f0 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
2d600 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
2d610 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2d620 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
2d630 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
2d640 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
2d650 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
2d660 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2d670 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2d680 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
2d690 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d6a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2d6b0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2d6c0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2d6d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2d6e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
2d6f0 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
2d700 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2d710 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
2d720 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
2d730 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2d740 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
2d750 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
2d760 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
2d770 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
2d780 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
2d790 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2d7a0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
2d7b0 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
2d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2d7d0 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
2d7e0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
2d7f0 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
2d800 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2d810 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2d820 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2d830 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2d840 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
2d850 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
2d860 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2d870 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
2d880 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2d890 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2d8a0 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2d8b0 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
2d8c0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2d8d0 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2d8e0 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2d8f0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2d900 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2d910 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
2d920 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2d930 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
2d940 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2d950 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
2d960 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
2d970 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
2d980 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
2d990 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
2d9a0 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
2d9b0 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
2d9c0 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
2d9d0 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
2d9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
2d9f0 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
2da00 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
2da10 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
2da20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
2da30 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
2da40 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
2da50 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
2da60 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
2da70 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
2da80 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2da90 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46   +         /* zF
2daa0 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
2dab0 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32  Pathname + 8 + 2
2dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dad0 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66   zJournal */.#if
2dae0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2daf0 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68  _WAL.    + nPath
2db00 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20  name + 4 + 2    
2db10 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20          /* zWal 
2db20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  */.#endif.  );. 
2db30 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2db40 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
2db50 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
2db60 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2db70 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
2db80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2db90 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2dba0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2dbb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2dbc0 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  T;.  }.  pPager 
2dbd0 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2dbe0 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2dbf0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2dc00 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2dc10 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2dc20 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2dc30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2dc40 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2dc50 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2dc60 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2dc70 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2dc80 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2dc90 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2dca0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2dcb0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2dcc0 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2dcd0 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2dce0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2dcf0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2dd00 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2dd10 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2dd20 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2dd30 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2dd40 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2dd50 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2dd60 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2dd70 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2dd80 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2dd90 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2dda0 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2ddb0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2ddc0 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2ddd0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2dde0 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2ddf0 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2de00 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2de10 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2de20 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2de30 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2de40 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
2de50 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70  nUri ) memcpy(&p
2de60 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2de70 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a  [nPathname+1], z
2de80 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
2de90 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2dea0 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
2deb0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2dec0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2ded0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2dee0 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
2def0 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20  al\000", 8+2);. 
2df00 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2df10 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2df20 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2df30 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e  >zJournal);.#ifn
2df40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2df50 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2df60 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2df70 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2df80 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2df90 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2dfa0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2dfb0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2dfc0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2dfd0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2dfe0 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a  wal\000", 4+1);.
2dff0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2e000 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2e010 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2e020 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a  ->zWal);.#endif.
2e030 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2e040 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2e050 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2e060 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2e070 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2e080 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2e090 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2e0a0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2e0b0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2e0c0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2e0d0 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0f0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2e100 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2e110 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2e120 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2e130 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2e140 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2e150 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2e160 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2e170 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2e180 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2e190 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e1a0 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2e1b0 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2e1c0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2e1d0 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2e1e0 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2e1f0 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2e200 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2e210 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2e220 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2e230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2e240 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2e250 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2e260 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2e270 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2e280 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2e290 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2e2a0 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2e2b0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2e2c0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2e2d0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2e2e0 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2e2f0 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2e300 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2e310 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2e320 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e330 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
2e340 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2e350 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2e360 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2e370 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20    if( !readOnly 
2e380 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65  ){.        setSe
2e390 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2e3a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2e3b0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2e3c0 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
2e3d0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e3e0 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
2e3f0 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
2e400 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
2e410 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
2e420 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
2e430 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
2e440 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2e450 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
2e460 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2e470 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2e480 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2e490 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2e4a0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2e4b0 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50  geDflt = (u32)pP
2e4c0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2e4d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e4e0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
2e4f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2e500 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
2e510 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
2e520 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
2e530 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2e540 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2e550 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2e560 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2e570 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
2e580 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
2e590 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2e5a0 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
2e5b0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
2e5c0 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
2e5d0 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
2e5e0 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
2e5f0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2e600 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
2e610 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e620 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
2e630 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
2e640 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2e650 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2e660 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ii;.            
2e670 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2e680 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2e690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
2e6a0 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71  ger->noLock = sq
2e6b0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2e6c0 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f  n(zFilename, "no
2e6d0 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20  lock", 0);.     
2e6e0 20 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49   if( (iDc & SQLI
2e6f0 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42  TE_IOCAP_IMMUTAB
2e700 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  LE)!=0.       ||
2e710 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2e720 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2e730 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20  "immutable", 0) 
2e740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73  ){.          vfs
2e750 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
2e760 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2e770 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63           goto ac
2e780 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65  t_like_temp_file
2e790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e7a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2e7b0 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2e7c0 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2e7d0 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2e7e0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2e7f0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2e800 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2e810 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2e820 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2e830 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2e840 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2e850 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2e860 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2e870 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2e880 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2e890 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2e8a0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2e8b0 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2e8c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2e8d0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2e8e0 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2e8f0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2e900 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2e910 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2e920 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2e930 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2e940 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2e950 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20  ranch also runs 
2e960 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64  for files marked
2e970 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20   as immutable.. 
2e980 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f     */ .act_like_
2e990 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74  temp_file:.    t
2e9a0 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
2e9b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2e9c0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20  = PAGER_READER; 
2e9d0 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2e9e0 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
2e9f0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61   lock */.    pPa
2ea00 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2ea10 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20  LUSIVE_LOCK;    
2ea20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72  /* Pretend we ar
2ea30 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d  e in EXCLUSIVE m
2ea40 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ode */.    pPage
2ea50 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20  r->noLock = 1;  
2ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ea70 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a   Do no locking *
2ea80 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  /.    readOnly =
2ea90 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
2eaa0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2eab0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2eac0 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
2ead0 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
2eae0 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
2eaf0 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2eb00 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
2eb10 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
2eb20 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
2eb30 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
2eb40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2eb50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2eb60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2eb70 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
2eb80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2eb90 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
2eba0 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
2ebb0 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
2ebc0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
2ebd0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
2ebe0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2ebf0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a  PCache object. *
2ec00 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2ec10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2ec20 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30  ert( nExtra<1000
2ec30 20 29 3b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d   );.    nExtra =
2ec40 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
2ec50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ec60 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
2ec70 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
2ec80 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
2ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
2eca0 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
2ecb0 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
2ecc0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
2ecd0 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ache);.  }..  /*
2ece0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2ecf0 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65  urred above, fre
2ed00 65 20 74 68 65 20 20 50 61 67 65 72 20 73 74 72  e the  Pager str
2ed10 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
2ed20 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
2ed30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ed40 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2ed50 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2ed60 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
2ed70 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
2ed80 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
2ed90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2eda0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2edb0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
2edc0 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e  AGERTRACE(("OPEN
2edd0 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
2ede0 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
2edf0 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
2ee00 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52  lename));.  IOTR
2ee10 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
2ee20 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
2ee30 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2ee40 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ..  pPager->useJ
2ee50 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
2ee60 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50  Journal;.  /* pP
2ee70 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
2ee80 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ee90 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
2eea0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2eeb0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
2eec0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2eed0 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
2eee0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
2eef0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2ef00 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
2ef10 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2ef20 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
2ef30 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
2ef40 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2ef50 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
2ef60 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  OCK; */.  /* pPa
2ef70 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
2ef80 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
2ef90 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
2efa0 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
2efb0 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
2efc0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2efd0 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
2efe0 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
2eff0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2f000 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
2f010 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2f020 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2f030 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
2f040 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2f050 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
2f060 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
2f070 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
2f080 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2f090 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
2f0a0 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
2f0b0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
2f0c0 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
2f0d0 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
2f0e0 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
2f0f0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
2f100 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
2f110 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2f120 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
2f130 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
2f140 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
2f150 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
2f160 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2f170 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  xtraSync==0 );. 
2f180 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2f190 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20  r->syncFlags==0 
2f1a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2f1b0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2f1c0 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2f1d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b  sert( pPager->ck
2f1e0 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ptSyncFlags==0 )
2f1f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2f200 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
2f210 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2f220 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a  >extraSync = 0;.
2f230 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
2f240 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2f250 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
2f260 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2f270 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2f280 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f  NC_NORMAL | WAL_
2f290 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
2f2a0 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  S;.    pPager->c
2f2b0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
2f2c0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2f2d0 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  L;.  }.  /* pPag
2f2e0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2f2f0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2f300 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2f310 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f320 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2f330 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2f340 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2f350 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2f360 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2f370 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2f380 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2f390 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2f3a0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2f3b0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2f3c0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2f3d0 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2f3e0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2f3f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2f400 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2f410 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2f420 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
2f430 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2f440 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2f450 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2f460 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
2f470 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
2f480 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
2f490 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
2f4a0 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
2f4b0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
2f4c0 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
2f4d0 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
2f4e0 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
2f4f0 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
2f500 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  )); */.  /* pPag
2f510 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  er->szMmap = SQL
2f520 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
2f530 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65  _SIZE // will be
2f540 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20   set by btree.c 
2f550 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  */..  *ppPager =
2f560 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
2f570 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2f580 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
2f590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f5a0 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c  e has not be del
2f5b0 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20  eted or renamed 
2f5c0 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65  out from.** unde
2f5d0 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65  r the pager.  Re
2f5e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2f5f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2f600 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20  s still were it 
2f610 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f  ought.** to be o
2f620 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  n disk.  Return 
2f630 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45  non-zero (SQLITE
2f640 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
2f650 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  D or some other 
2f660 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72  error.** code fr
2f670 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  om sqlite3OsAcce
2f680 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74  ss()) if the dat
2f690 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d  abase has gone m
2f6a0 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  issing..*/.stati
2f6b0 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73  c int databaseIs
2f6c0 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70  Unmoved(Pager *p
2f6d0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48  Pager){.  int bH
2f6e0 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69  asMoved = 0;.  i
2f6f0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
2f700 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2f710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f720 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
2f730 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74  >dbSize==0 ) ret
2f740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2f750 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f760 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50  >zFilename && pP
2f770 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2f780 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  0] );.  rc = sql
2f790 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
2f7a0 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
2f7b0 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
2f7c0 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64  OVED, &bHasMoved
2f7d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2f7e0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
2f7f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41      /* If the HA
2f800 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e  S_MOVED file-con
2f810 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d  trol is unimplem
2f820 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ented, assume th
2f830 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  at the file.    
2f840 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
2f850 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20  moved.  That is 
2f860 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62  the historical b
2f870 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74  ehavior of SQLit
2f880 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  e: prior to.    
2f890 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33  ** version 3.8.3
2f8a0 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b  , it never check
2f8b0 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  ed */.    rc = S
2f8c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2f8d0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2f8e0 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64  _OK && bHasMoved
2f8f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2f900 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
2f910 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OVED;.  }.  retu
2f920 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2f930 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f940 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
2f950 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
2f960 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
2f970 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
2f980 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
2f990 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
2f9a0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
2f9b0 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
2f9c0 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2f9d0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
2f9e0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
2f9f0 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
2fa00 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2fa10 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
2fa20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2fa30 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
2fa40 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
2fa50 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2fa60 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
2fa70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2fa80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2fa90 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
2faa0 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
2fab0 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
2fac0 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
2fad0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2fae0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2faf0 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
2fb00 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2fb10 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
2fb20 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
2fb30 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
2fb40 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
2fb50 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
2fb60 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2fb70 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
2fb80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2fb90 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
2fba0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2fbb0 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
2fbc0 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
2fbd0 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
2fbe0 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
2fbf0 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
2fc00 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
2fc10 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2fc20 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
2fc30 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2fc40 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
2fc50 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
2fc60 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
2fc70 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
2fc80 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
2fc90 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2fca0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2fcb0 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
2fcc0 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
2fcd0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2fce0 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
2fcf0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
2fd00 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
2fd10 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
2fd20 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
2fd30 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
2fd40 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2fd50 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2fd60 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
2fd70 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
2fd80 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
2fd90 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
2fda0 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
2fdb0 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
2fdc0 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
2fdd0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2fde0 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2fdf0 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
2fe00 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
2fe10 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
2fe20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2fe30 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
2fe40 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
2fe50 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
2fe60 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2fe70 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
2fe80 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2fe90 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
2fea0 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
2feb0 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
2fec0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2fed0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2fee0 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
2fef0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2ff00 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
2ff10 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
2ff20 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
2ff30 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
2ff40 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2ff50 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
2ff60 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
2ff70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2ff80 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
2ff90 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
2ffa0 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
2ffb0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2ffc0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2ffd0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
2ffe0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2fff0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30000 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
30010 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
30020 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
30030 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
30040 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
30050 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
30060 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
30070 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
30080 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
30090 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
300a0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
300b0 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
300c0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
300d0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
300e0 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
300f0 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
30100 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
30110 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
30120 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
30130 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
30140 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
30150 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
30160 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
30170 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
30180 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
30190 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
301a0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
301b0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
301c0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
301d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
301e0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
301f0 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
30200 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
30210 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
30220 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
30230 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
30240 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
30250 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
30260 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
30270 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
30280 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
30290 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
302a0 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
302b0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
302c0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
302d0 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
302e0 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
302f0 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
30300 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
30310 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
30320 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
30330 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
30340 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
30350 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
30360 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
30370 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
30380 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
30390 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
303a0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
303b0 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
303c0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
303d0 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
303e0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
303f0 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
30400 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
30410 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
30420 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
30430 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
30440 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
30450 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
30460 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
30470 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
30480 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30490 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
304a0 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
304b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
304c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
304d0 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
304e0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
304f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30500 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20  tempFile==0 );. 
30510 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
30520 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
30530 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
30540 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30550 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
30560 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
30570 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e  is zero pages in
30580 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e   size, that mean
30590 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31  s that either (1
305a0 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  ) the.        **
305b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65   journal is a re
305c0 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69  mnant from a pri
305d0 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68  or database with
305e0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77   the same name w
305f0 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
30600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30610 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f  e but not the jo
30620 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65  urnal was delete
30630 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e  d, or (2) the in
30640 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  itial.        **
30650 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
30660 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65  t populates a ne
30670 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65  w database is be
30680 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ing rolled back.
30690 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65  .        ** In e
306a0 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20  ither case, the 
306b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
306c0 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f   be deleted.  Ho
306d0 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65  wever, take care
306e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
306f0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
30700 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
30710 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
30720 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20   due to.        
30730 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  ** journal_mode=
30740 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20  PERSIST..       
30750 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
30760 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e  nPage==0 && !jrn
30770 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
30780 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
30790 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
307a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67           if( pag
307b0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
307c0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d   RESERVED_LOCK)=
307d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
307e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
307f0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
30800 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
30810 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
30820 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
30830 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70  xclusiveMode ) p
30840 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
30850 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
30860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
30870 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30880 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
30890 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
308a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
308b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
308c0 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74  exists and no ot
308d0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
308e0 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20  as a reserved.  
308f0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72          ** or gr
30900 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
30910 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
30920 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
30930 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
30940 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
30950 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65  ne non-zero byte
30960 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
30970 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
30980 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le..          **
30990 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68   If there is, th
309a0 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74  en we consider t
309b0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  his journal to b
309c0 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a  e hot. If not, .
309d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
309e0 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  can be ignored..
309f0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
30a00 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
30a10 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
30a20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
30a30 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
30a40 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
30a50 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
30a60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30a70 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
30a80 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
30a90 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
30aa0 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20  , &f);.         
30ab0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
30ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30ad0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38  {.            u8
30ae0 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20   first = 0;.    
30af0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30b00 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
30b10 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29  r->jfd, (void *)
30b20 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20  &first, 1, 0);. 
30b30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
30b40 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
30b50 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
30b60 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30b70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30b90 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
30ba0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
30bb0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
30bc0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
30bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
30be0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
30bf0 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30  ists = (first!=0
30c00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
30c10 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
30c20 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
30c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
30c40 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  we cannot open t
30c50 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
30c60 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  nal file in orde
30c70 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  r to see if.    
30c80 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
30c90 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
30ca0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
30cb0 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
30cc0 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
30cd0 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
30ce0 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
30cf0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
30d00 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
30d10 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
30d20 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
30d30 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
30d40 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
30d50 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
30d60 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
30d70 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
30d80 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
30d90 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
30da0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
30db0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
30dc0 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
30dd0 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
30de0 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
30df0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
30e00 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
30e10 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
30e20 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
30e30 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
30e40 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
30e50 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
30e60 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
30e70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30e80 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
30e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
30ea0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30eb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30ec0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30ed0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
30ee0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
30ef0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
30f00 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
30f10 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
30f20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30f30 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
30f40 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
30f50 74 65 33 50 61 67 65 72 47 65 74 28 29 20 75 6e  te3PagerGet() un
30f60 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
30f70 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
30f80 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
30f90 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
30fa0 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
30fb0 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
30fc0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
30fd0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
30fe0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
30ff0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
31000 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
31010 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
31020 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
31030 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
31040 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
31050 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
31060 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
31070 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
31080 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31090 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
310a0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
310b0 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
310c0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
310d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
310e0 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
310f0 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
31100 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
31110 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
31120 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
31130 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
31140 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
31150 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
31160 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
31170 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
31180 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
31190 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
311a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
311b0 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
311c0 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
311d0 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
311e0 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
311f0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
31200 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
31210 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
31220 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
31230 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
31240 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
31250 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
31260 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
31270 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
31280 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
31290 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
312a0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
312b0 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
312c0 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
312d0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
312e0 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
312f0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
31300 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
31310 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
31320 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
31330 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
31340 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
31350 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
31360 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
31370 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
31380 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
31390 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
313a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
313b0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
313c0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
313d0 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
313e0 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
313f0 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
31400 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
31410 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
31420 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
31430 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
31440 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
31450 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
31460 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
31470 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
31480 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
31490 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
314a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
314b0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
314c0 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
314d0 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
314e0 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
314f0 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
31500 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
31510 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
31520 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
31530 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
31540 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
31550 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
31560 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
31570 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
31580 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
31590 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
315a0 63 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a  ccess mode.  */.
315b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
315c0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
315d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
315e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
315f0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
31600 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
31610 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31620 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31630 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
31640 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
31650 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
31660 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
31670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
31680 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
31690 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
316a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
316b0 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
316c0 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
316d0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
316e0 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
316f0 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
31700 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
31710 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
31720 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
31730 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
31740 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
31750 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
31760 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d  OCK );..    rc =
31770 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
31780 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
31790 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
317a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
317b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
317c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
317d0 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  NO_LOCK || pPage
317e0 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
317f0 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
31800 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31810 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
31820 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
31830 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
31840 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
31850 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
31860 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
31870 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
31880 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
31890 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
318a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
318b0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
318c0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
318d0 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
318e0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
318f0 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a   &bHotJournal);.
31900 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
31910 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31920 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
31930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31940 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  bHotJournal ){. 
31950 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
31960 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
31970 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31980 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
31990 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  CK;.        goto
319a0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
319b0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  ..      /* Get a
319c0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
319d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
319e0 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
319f0 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
31a00 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
31a10 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
31a20 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
31a30 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
31a40 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
31a50 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
31a60 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
31a70 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
31a80 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
31a90 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
31aa0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
31ab0 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
31ac0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
31ad0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
31ae0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
31af0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
31b00 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
31b10 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
31b20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
31b30 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
31b40 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
31b50 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
31b60 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
31b70 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
31b80 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
31b90 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
31ba0 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
31bb0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
31bc0 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
31bd0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
31be0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
31bf0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
31c00 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
31c10 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
31c20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
31c30 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
31c40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
31c50 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
31c60 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  s in locking_mod
31c70 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
31c80 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20  , the lock is.  
31c90 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65      ** downgrade
31ca0 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b  d to SHARED_LOCK
31cb0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
31cc0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20  ction returns.. 
31cd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
31ce0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
31cf0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
31d00 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
31d10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31d20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
31d30 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
31d40 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74   .      /* If it
31d50 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
31d60 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c  open and the fil
31d70 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  e exists on disk
31d80 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20  , open the .    
31d90 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72    ** journal for
31da0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
31db0 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73  ss. Write access
31dc0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
31dd0 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  ause .      ** i
31de0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
31df0 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
31e00 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
31e10 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20   be kept open . 
31e20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73       ** and poss
31e30 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
31e40 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
31e50 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74  r on. Also, writ
31e60 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20  e-access .      
31e70 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65  ** is usually re
31e80 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69  quired to finali
31e90 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ze the journal i
31ea0 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70  n journal_mode=p
31eb0 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  ersist .      **
31ec0 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20   mode (and also 
31ed0 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  for journal_mode
31ee0 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d  =truncate on som
31ef0 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20  e systems)..    
31f00 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
31f10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
31f20 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20  s not exist, it 
31f30 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68  usually means th
31f40 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a  at some .      *
31f50 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
31f60 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
31f70 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
31f80 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
31f90 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e      ** this conn
31fa0 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20  ection obtained 
31fb0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
31fc0 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74  ck above. Or, it
31fd0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d   .      ** may m
31fe0 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67  ean that the pag
31ff0 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72  er was in the er
32000 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
32010 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
32020 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
32030 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
32040 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
32050 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
32060 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
32070 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
32080 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32090 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
320a0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
320b0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45  ;.        int bE
320c0 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20  xists;          
320d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
320e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
320f0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ts */.        rc
32100 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
32110 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss(.            
32120 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32130 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
32140 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62  CCESS_EXISTS, &b
32150 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20  Exists);.       
32160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32170 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b  OK && bExists ){
32180 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
32190 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
321a0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
321b0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
321c0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
321d0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
321e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
321f0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
32200 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
32210 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
32220 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
32230 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
32240 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
32250 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
32260 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
32270 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
32280 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
32290 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
322a0 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
322b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
322c0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
322d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
322e0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
322f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
32300 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
32310 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  fd);.          }
32320 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32330 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c   }. .      /* Pl
32340 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
32350 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
32360 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
32370 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
32380 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
32390 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
323a0 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
323b0 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
323c0 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
323d0 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
323e0 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
323f0 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
32400 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
32410 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
32420 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
32430 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
32440 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
32450 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
32460 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
32470 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
32480 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
32490 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
324a0 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
324b0 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
324c0 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
324d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
324e0 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
324f0 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
32500 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
32510 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32520 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  fd) ){.        a
32530 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
32540 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
32550 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  rc = pagerSyncHo
32560 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
32570 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
32580 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32590 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
325a0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
325b0 67 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65  ger, !pPager->te
325c0 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  mpFile);.       
325d0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
325e0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
325f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32600 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
32610 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
32620 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
32630 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
32640 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
32650 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
32660 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32670 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
32680 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
32690 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ken if an error 
326a0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
326b0 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20  ing to open.    
326c0 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62      ** or roll b
326d0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
326e0 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  l while holding 
326f0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
32700 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  k. The.        *
32710 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
32720 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
32730 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
32740 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f  eturning to unlo
32750 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ck.        ** th
32760 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75  e file. If the u
32770 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61  nlock attempt fa
32780 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ils, then Pager.
32790 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20  eLock must be.  
327a0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
327b0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65  UNKNOWN_LOCK (se
327c0 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
327d0 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
327e0 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  for .        ** 
327f0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f  UNKNOWN_LOCK abo
32800 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  ve for an explan
32810 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20  ation). .       
32820 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
32830 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70  n order to get p
32840 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f  ager_unlock() to
32850 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61   do this, set Pa
32860 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20  ger.eState to.  
32870 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45        ** PAGER_E
32880 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69  RROR now. This i
32890 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  s not actually c
328a0 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e  ounted as a tran
328b0 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  sition.        *
328c0 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  * to ERROR state
328d0 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69   in the state di
328e0 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70  agram at the top
328f0 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20   of this file,. 
32900 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20         ** since 
32910 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
32920 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61   same call to pa
32930 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
32940 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a  l very.        *
32950 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69  * shortly transi
32960 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f  tion the pager o
32970 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45  bject to the OPE
32980 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67  N state. Calling
32990 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65  .        ** asse
329a0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
329b0 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c   would fail now,
329c0 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f   as it should no
329d0 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20  t be possible.  
329e0 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
329f0 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
32a00 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72  en there are zer
32a10 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
32a20 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ge .        ** r
32a30 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20  eferences..     
32a40 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61     */.        pa
32a50 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
32a60 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67  , rc);.        g
32a70 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
32a80 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
32a90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
32aa0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
32ab0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
32ac0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53  pPager->eLock==S
32ad0 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
32ae0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
32af0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
32b00 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
32b10 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  k>SHARED_LOCK). 
32b20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
32b30 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
32b40 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67  tempFile && pPag
32b50 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
32b60 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  dLock ){.      /
32b70 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
32b80 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
32b90 61 63 71 75 69 72 65 64 20 74 68 65 6e 20 63 68  acquired then ch
32ba0 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eck to.      ** 
32bb0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
32bc0 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ase has been mod
32bd0 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
32be0 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
32bf0 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c  ged,.      ** fl
32c00 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20  ush the cache.  
32c10 54 68 65 20 68 61 73 48 65 6c 64 53 68 61 72 65  The hasHeldShare
32c20 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65  dLock flag preve
32c30 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20  nts this from.  
32c40 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67      ** occurring
32c50 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72   on the very fir
32c60 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66  st access to a f
32c70 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ile, in order to
32c80 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a   save a.      **
32c90 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73   single unnecess
32ca0 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61  ary sqlite3OsRea
32cb0 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20  d() call at the 
32cc0 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20  start-up..      
32cd0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
32ce0 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65  base changes are
32cf0 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
32d00 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
32d10 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
32d20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
32d30 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
32d40 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
32d50 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
32d60 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
32d70 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
32d80 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
32d90 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
32da0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
32db0 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
32dc0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
32dd0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
32de0 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
32df0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
32e00 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
32e10 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
32e20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
32e30 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
32e40 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
32e50 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
32e60 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
32e70 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
32e80 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
32e90 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
32ea0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
32eb0 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
32ec0 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
32ed0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
32ee0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
32ef0 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
32f00 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
32f10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
32f20 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
32f30 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
32f40 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
32f50 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
32f60 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
32f70 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
32f80 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
32f90 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
32fa0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
32fb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32fc0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
32fd0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
32fe0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32ff0 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
33000 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33010 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
33020 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
33030 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
33040 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
33050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
33060 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
33070 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
33080 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33090 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
330a0 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
330b0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
330c0 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
330d0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
330e0 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
330f0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
33100 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
33110 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61   /* Unmap the da
33120 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
33130 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
33140 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
33150 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
33160 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65  ay have truncate
33170 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
33180 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74  ile and then ext
33190 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20  ended it back.  
331a0 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20        ** to its 
331b0 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68  original size wh
331c0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
331d0 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67   was not holding
331e0 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20   a lock..       
331f0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
33200 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74   there may exist
33210 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61   a Pager.pMap ma
33220 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61  pping that appea
33230 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  rs.        ** to
33240 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69   be the right si
33250 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63  ze but is not ac
33260 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76  tually valid. Av
33270 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20  oid this.       
33280 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20   ** possibility 
33290 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65  by unmapping the
332a0 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20   db here. */.   
332b0 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43       if( USEFETC
332c0 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  H(pPager) ){.   
332d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
332e0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
332f0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
33300 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33310 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
33320 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
33330 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
33340 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
33350 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
33360 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
33370 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
33380 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
33390 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
333a0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
333b0 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
333c0 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
333d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
333e0 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
333f0 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
33400 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
33410 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
33420 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
33430 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
33440 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
33450 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
33460 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
33470 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
33480 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
33490 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
334a0 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61 67 65  File==0 && pPage
334b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
334c0 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c  _OPEN && rc==SQL
334d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
334e0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
334f0 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  t(pPager, &pPage
33500 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
33510 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
33520 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33530 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
33540 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
33550 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
33560 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
33570 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33580 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c  ER_OPEN );.  }el
33590 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
335a0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
335b0 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
335c0 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
335d0 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Lock = 1;.  }.  
335e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
335f0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
33600 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
33610 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
33620 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
33630 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
33640 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
33650 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
33660 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
33670 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
33680 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
33690 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
336a0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
336b0 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
336c0 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
336d0 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
336e0 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
336f0 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
33700 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
33710 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
33720 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
33730 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
33740 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
33750 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26  ->nMmapOut==0 &&
33760 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
33770 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
33780 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a  pPCache)==0) ){.
33790 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
337a0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
337b0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
337c0 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72   Acquire a refer
337d0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d  ence to page num
337e0 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65  ber pgno in page
337f0 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65  r pPager (a page
33800 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61  .** reference ha
33810 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e  s type DbPage*).
33820 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
33830 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
33840 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
33850 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
33860 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
33870 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
33880 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
33890 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
338a0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
338b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
338c0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
338d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
338e0 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
338f0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
33900 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
33910 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
33920 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
33930 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
33940 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
33950 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
33960 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
33970 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
33980 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
33990 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
339a0 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
339b0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
339c0 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
339d0 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
339e0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
339f0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
33a00 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
33a10 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
33a20 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
33a30 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
33a40 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
33a50 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
33a60 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
33a70 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
33a80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
33a90 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
33aa0 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
33ab0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
33ac0 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
33ad0 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
33ae0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
33af0 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
33b00 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
33b10 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
33b20 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
33b30 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
33b40 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
33b50 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
33b60 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
33b70 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
33b80 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
33b90 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
33ba0 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
33bb0 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
33bc0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
33bd0 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
33be0 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
33bf0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
33c00 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
33c10 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
33c20 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
33c30 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
33c40 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
33c50 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
33c60 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
33c70 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65  ccurs in two sce
33c80 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
33c90 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
33ca0 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
33cb0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
33cc0 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
33cd0 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
33ce0 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
33cf0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
33d00 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
33d10 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
33d20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
33d30 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  che to be filled
33d40 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72   with the data r
33d50 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
33d60 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a   the savepoint j
33d70 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
33d80 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
33d90 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
33da0 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65  a returned is ze
33db0 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  roed instead of.
33dc0 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72  ** being read fr
33dd0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
33de0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
33df0 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f  he bits correspo
33e00 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f  nding.** to pgno
33e10 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
33e20 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20  rnal (bitvec of 
33e30 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72  pages already wr
33e40 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
33e50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
33e60 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
33e70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
33e80 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79  t bitvecs of any
33e90 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69   open.** savepoi
33ea0 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  nts are set. Thi
33eb0 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70  s means if the p
33ec0 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  age is made writ
33ed0 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70  able at any.** p
33ee0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
33ef0 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  re, using a call
33f00 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
33f10 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e  Write(), its con
33f20 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  tents.** will no
33f30 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  t be journaled. 
33f40 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a  This saves IO..*
33f50 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
33f60 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
33f70 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
33f80 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
33f90 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
33fa0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
33fb0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
33fc0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
33fd0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
33fe0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
33ff0 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
34000 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
34010 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
34020 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
34030 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
34040 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
34050 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
34060 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
34070 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
34080 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
34090 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
340a0 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
340b0 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
340c0 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
340d0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
340e0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
340f0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
34100 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
34110 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
34120 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
34130 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
34140 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
34150 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
34160 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
34170 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
34180 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
34190 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
341a0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
341b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20  lite3PagerGet(. 
341c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
341d0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
341e0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
341f0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
34200 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
34210 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
34220 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
34230 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
34240 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
34250 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
34260 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
34270 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
34280 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
34290 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
342a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
342b0 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
342c0 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46  Pg = 0;.  u32 iF
342d0 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rame = 0;       
342e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
342f0 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  me to read from 
34300 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  WAL file */.  co
34310 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  nst int noConten
34320 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  t = (flags & PAG
34330 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
34340 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  );..  /* It is a
34350 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
34360 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
34370 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
34380 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
34390 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
343a0 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
343b0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
343c0 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
343d0 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
343e0 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
343f0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
34400 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
34410 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
34420 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
34430 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
34440 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
34450 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
34460 67 6e 6f 3e 31 20 26 26 20 55 53 45 46 45 54 43  gno>1 && USEFETC
34470 48 28 70 50 61 67 65 72 29 0a 20 20 20 26 26 20  H(pPager).   && 
34480 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
34490 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c  =PAGER_READER ||
344a0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
344b0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23  GET_READONLY)).#
344c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
344d0 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61  _CODEC.   && pPa
344e0 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23  ger->xCodec==0.#
344f0 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a  endif.  );..  /*
34500 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f   Optimization no
34510 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20  te:  Adding the 
34520 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62  "pgno<=1" term b
34530 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20  efore "pgno==0" 
34540 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73  here.  ** allows
34550 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
34560 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65  timizer to reuse
34570 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
34580 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a  the "pgno>1".  *
34590 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72  * test in the pr
345a0 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74  evious statement
345b0 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74  , and avoid test
345c0 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74  ing pgno==0 in t
345d0 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63  he.  ** common c
345e0 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69  ase where pgno i
345f0 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66  s large. */.  if
34600 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e  ( pgno<=1 && pgn
34610 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
34620 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
34630 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
34640 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
34650 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
34660 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
34670 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
34680 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
34690 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e  assert( noConten
346a0 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d  t==0 || bMmapOk=
346b0 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  =0 );..  assert(
346c0 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
346d0 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b  SharedLock==1 );
346e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
346f0 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
34700 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
34710 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74   an CONCURRENT t
34720 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74  ransaction and t
34730 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 72 65  he page being re
34740 61 64 20 77 61 73 0a 20 20 2a 2a 20 70 72 65 73  ad was.  ** pres
34750 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
34760 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
34770 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
34780 73 20 6f 70 65 6e 65 64 2c 0a 20 20 2a 2a 20 6d  s opened,.  ** m
34790 61 72 6b 20 69 74 20 61 73 20 72 65 61 64 20 69  ark it as read i
347a0 6e 20 74 68 65 20 70 41 6c 6c 52 65 61 64 20 76  n the pAllRead v
347b0 65 63 74 6f 72 2e 20 20 2a 2f 0a 20 20 69 66 28  ector.  */.  if(
347c0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61   pPager->pAllRea
347d0 64 20 26 26 20 70 67 6e 6f 3c 3d 70 50 61 67 65  d && pgno<=pPage
347e0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
347f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34800 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
34810 72 2d 3e 70 41 6c 6c 52 65 61 64 2c 20 70 67 6e  r->pAllRead, pgn
34820 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
34830 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
34840 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34850 72 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rr;.  }.#endif..
34860 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
34870 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
34880 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20  r state, return 
34890 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61  an error immedia
348a0 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  tely. .  ** Othe
348b0 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74  rwise, request t
348c0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
348d0 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a   PCache layer. *
348e0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
348f0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
34900 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
34910 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
34920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
34930 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67 65   bMmapOk && page
34940 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
34950 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
34960 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
34970 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
34980 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
34990 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
349a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
349b0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
349c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
349d0 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61   bMmapOk && iFra
349e0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  me==0 ){.      v
349f0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a  oid *pData = 0;.
34a00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34a10 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67 65  te3OsFetch(pPage
34a20 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20  r->fd, .        
34a30 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20    (i64)(pgno-1) 
34a40 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
34a50 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ze, pPager->page
34a60 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20  Size, &pData.   
34a70 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28     );..      if(
34a80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
34a90 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  & pData ){.     
34aa0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
34ab0 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44  State>PAGER_READ
34ac0 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  ER || pPager->te
34ad0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
34ae0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
34af0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
34b00 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
34b10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
34b20 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
34b30 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
34b40 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70  AcquireMapPage(p
34b50 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61  Pager, pgno, pDa
34b60 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20  ta, &pPg);.     
34b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34b80 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
34b90 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
34ba0 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70   (i64)(pgno-1)*p
34bb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
34bc0 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
34bd0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
34be0 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Pg ){.          
34bf0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
34c00 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
34c10 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67     *ppPage = pPg
34c20 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
34c30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
34c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34c50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34c70 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34c80 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34c90 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a   }.    }..    {.
34ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 63        sqlite3_pc
34cb0 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65  ache_page *pBase
34cc0 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d 20  ;.      pBase = 
34cd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34ce0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
34cf0 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  he, pgno, 3);.  
34d00 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
34d10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34d20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34d30 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65 72  tchStress(pPager
34d40 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34d50 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20   &pBase);.      
34d60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34d70 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
34d80 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34d90 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d        if( pBase=
34da0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
34db0 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
34dc0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
34dd0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
34de0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
34df0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34e00 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d  e_err;.        }
34e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
34e20 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73  Pg = *ppPage = s
34e30 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34e40 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
34e50 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
34e60 42 61 73 65 29 3b 0a 20 20 20 20 20 20 61 73 73  Base);.      ass
34e70 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20  ert( pPg!=0 );. 
34e80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
34e90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34ea0 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
34eb0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
34ec0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
34ed0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
34ee0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
34ef0 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
34f00 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
34f10 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
34f20 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
34f30 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
34f40 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
34f50 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
34f60 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
34f70 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
34f80 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34f90 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
34fa0 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50  sert( pPg==(*ppP
34fb0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
34fc0 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  ( pPg->pgno==pgn
34fd0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
34fe0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
34ff0 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  er || pPg->pPage
35000 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  r==0 );..  if( p
35010 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  Pg->pPager && !n
35020 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
35030 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
35040 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
35050 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
35060 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
35070 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
35080 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
35090 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
350a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
350b0 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
350c0 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
350d0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
350e0 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
350f0 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
35100 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20  TAT_HIT]++;.    
35110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35120 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
35130 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
35140 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
35150 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
35160 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
35170 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
35180 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20  alized.  */..   
35190 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
351a0 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54  Pager;..    /* T
351b0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
351c0 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
351d0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
351e0 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
351f0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72      ** number gr
35200 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
35210 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c   or the unused l
35220 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20  ocking-page, is 
35230 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
35240 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
35250 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
35260 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
35270 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
35280 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
35290 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
352a0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
352b0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
352c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
352d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
352e0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
352f0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
35300 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
35310 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f  ger->dbSize<pgno
35320 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b   || noContent ){
35330 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
35340 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
35350 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
35360 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
35370 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
35380 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
35390 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
353a0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
353b0 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
353c0 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
353d0 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
353e0 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
353f0 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
35400 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
35410 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
35420 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
35430 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
35440 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
35450 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
35460 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
35470 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
35480 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
35490 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
354a0 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
354b0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
354c0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
354d0 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
354e0 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
354f0 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
35500 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
35510 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
35520 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
35530 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
35540 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
35550 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
35560 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
35570 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
35580 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35590 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
355a0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
355b0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
355c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
355d0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
355e0 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
355f0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
35600 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
35610 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
35620 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
35630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
35640 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
35650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
35660 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
35670 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
35680 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f  eSize);.      IO
35690 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
356a0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
356b0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
356c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65  {.      if( page
356d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
356e0 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b  && bMmapOk==0 ){
356f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
35700 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
35710 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
35720 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
35730 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
35740 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
35750 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
35760 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
35770 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
35780 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
35790 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
357a0 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
357b0 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72  MISS]++;.      r
357c0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
357d0 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
357e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
357f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35800 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
35810 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
35820 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
35830 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
35840 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
35850 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
35860 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a  er_acquire_err:.
35870 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
35880 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
35890 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69   pPg ){.    sqli
358a0 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
358b0 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
358c0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
358d0 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67  ager);..  *ppPag
358e0 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
358f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
35900 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
35910 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
35920 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
35930 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
35940 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
35950 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
35960 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
35970 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
35980 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
35990 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a  ot in cache. .**
359a0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
359b0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
359c0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
359d0 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
359e0 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
359f0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
35a00 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
35a10 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
35a20 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
35a30 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
35a40 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
35a50 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
35a60 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
35a70 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
35a80 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
35a90 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
35aa0 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
35ab0 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
35ac0 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
35ad0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
35ae0 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
35af0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
35b00 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
35b10 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  page *pPage;.  a
35b20 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
35b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
35b40 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no!=0 );.  asser
35b50 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  t( pPager->pPCac
35b60 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  he!=0 );.  pPage
35b70 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
35b80 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
35b90 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b  Cache, pgno, 0);
35ba0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35bb0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68  ==0 || pPager->h
35bc0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
35bd0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d   );.  if( pPage=
35be0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
35bf0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
35c00 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68  cacheFetchFinish
35c10 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
35c20 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a  , pgno, pPage);.
35c30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
35c40 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
35c50 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
35c60 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
35c70 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
35c80 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
35c90 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
35ca0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
35cb0 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
35cc0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
35cd0 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
35ce0 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
35cf0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
35d00 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
35d10 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
35d20 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f  * removed..*/.vo
35d30 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
35d40 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61  nrefNotNull(DbPa
35d50 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
35d60 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73  r *pPager;.  ass
35d70 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20  ert( pPg!=0 );. 
35d80 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
35d90 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67  Pager;.  if( pPg
35da0 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
35db0 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65  MMAP ){.    page
35dc0 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
35dd0 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pPg);.  }else{. 
35de0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
35df0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
35e00 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
35e10 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
35e20 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
35e30 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
35e40 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
35e50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  g ) sqlite3Pager
35e60 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67  UnrefNotNull(pPg
35e70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
35e80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
35e90 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
35ea0 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
35eb0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
35ec0 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
35ed0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
35ee0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
35ef0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
35f00 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
35f10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
35f20 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
35f30 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
35f40 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
35f50 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
35f60 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
35f70 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
35f80 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
35f90 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
35fa0 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
35fb0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
35fc0 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
35fd0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
35fe0 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
35ff0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
36000 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
36010 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
36020 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
36030 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
36040 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
36050 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
36060 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
36070 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
36080 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
36090 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
360a0 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
360b0 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
360c0 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
360d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
360e0 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
360f0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
36100 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
36110 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
36120 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
36130 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
36140 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
36150 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
36160 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
36170 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
36180 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
36190 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
361a0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
361b0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
361c0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
361d0 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
361e0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
361f0 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
36200 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
36210 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
36220 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
36230 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
36240 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
36250 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
36260 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
36270 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
36280 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
36290 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
362a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
362b0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
362c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
362d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
362e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
362f0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
36300 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
36310 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
36320 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
36330 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36340 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
36350 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
36360 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
36370 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
36380 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
36390 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
363a0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
363b0 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
363c0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
363d0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
363e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
363f0 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
36400 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
36410 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
36420 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
36430 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
36440 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
36450 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
36460 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
36470 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
36480 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
36490 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
364a0 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
364b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
364c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
364d0 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OFF ){.    pPage
364e0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
364f0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
36500 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
36510 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
36520 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
36530 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
36540 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
36550 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  BKPT;.    }.  . 
36560 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
36570 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
36580 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
36590 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   open. */.    if
365a0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
365b0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
365c0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
365d0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
365e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
365f0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y ){.        sql
36600 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
36610 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
36620 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
36630 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
36640 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
36650 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
36660 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
36670 20 20 20 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a      int nSpill;.
36680 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
36690 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
366a0 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
366b0 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
366c0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
366d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
366e0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
366f0 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c      nSpill = sql
36700 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74  ite3Config.nStmt
36710 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  Spill;.        }
36720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
36730 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
36740 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
36750 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70  L;.          nSp
36760 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72  ill = jrnlBuffer
36770 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
36780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36790 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65    .        /* Ve
367a0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61  rify that the da
367b0 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73  tabase still has
367c0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
367d0 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20  s it did when.  
367e0 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20        ** it was 
367f0 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
36800 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  d. */.        rc
36810 20 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d   = databaseIsUnm
36820 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  oved(pPager);.  
36830 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36850 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36860 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20  3JournalOpen (. 
36870 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66               pVf
36880 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
36890 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
368a0 2c 20 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a  , flags, nSpill.
368b0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
368c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
368d0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
368e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
368f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
36900 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ) );.    }.  .  
36910 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
36920 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
36930 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
36940 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
36950 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  pen .    ** the 
36960 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
36970 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
36980 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
36990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
369a0 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
369b0 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
369c0 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
369d0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  ed. */.      pPa
369e0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
369f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
36a00 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
36a10 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
36a20 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
36a30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
36a40 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  dr = 0;.      rc
36a50 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
36a60 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
36a70 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
36a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36a90 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
36aa0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
36ab0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
36ac0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
36ad0 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  al = 0;.  }else{
36ae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36af0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36b00 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36b10 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
36b20 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
36b30 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a  RITER_CACHEMOD;.
36b40 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
36b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
36b60 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
36b70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63  tion on the spec
36b80 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65  ified pager obje
36b90 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69  ct. If a .** wri
36ba0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
36bb0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
36bc0 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  opened, this fun
36bd0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
36be0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
36bf0 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  xFlag argument i
36c00 73 20 30 2c 20 74 68 65 6e 20 61 63 71 75 69 72  s 0, then acquir
36c10 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
36c20 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
36c30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36c40 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
36c50 20 3e 30 2c 20 74 68 65 6e 20 61 63 71 75 69 72   >0, then acquir
36c60 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e  e at least.** an
36c70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
36c80 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
36c90 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
36ca0 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20   no locking .** 
36cb0 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62  functions need b
36cc0 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
36cd0 49 66 20 28 65 78 46 6c 61 67 3c 30 29 20 61 6e  If (exFlag<0) an
36ce0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  d the database i
36cf0 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 64  s in WAL mode, d
36d00 6f 20 6e 6f 74 20 74 61 6b 65 20 61 6e 79 20 6c  o not take any l
36d10 6f 63 6b 73 2e 0a 2a 2a 20 54 68 65 20 74 72 61  ocks..** The tra
36d20 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 75  nsaction will ru
36d30 6e 20 69 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20  n in CONCURRENT 
36d40 6d 6f 64 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  mode instead..**
36d50 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
36d60 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
36d70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
36d80 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
36d90 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
36da0 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
36db0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
36dc0 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
36dd0 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
36de0 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
36df0 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
36e00 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
36e10 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
36e20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
36e30 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
36e40 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
36e50 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
36e60 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
36e70 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
36e80 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
36e90 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
36ea0 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
36eb0 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
36ec0 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
36ed0 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
36ee0 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
36ef0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
36f00 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
36f10 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
36f20 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
36f30 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
36f40 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
36f50 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
36f60 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
36f70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
36f80 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
36f90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
36fa0 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
36fb0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65  >errCode;.  asse
36fc0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36fd0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
36fe0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
36ff0 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29  te<PAGER_ERROR )
37000 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
37010 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
37020 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20  ubjInMemory;..  
37030 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65  if( ALWAYS(pPage
37040 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37050 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20  _READER) ){.    
37060 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37070 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
37080 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
37090 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
370a0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
370b0 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
370c0 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
370d0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
370e0 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
370f0 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
37100 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
37110 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
37120 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
37130 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
37140 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
37150 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
37160 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
37170 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
37180 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
37190 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
371a0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
371b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
371c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
371d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
371e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
371f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
37200 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
37210 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
37220 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
37230 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
37240 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20      /* Grab the 
37250 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
37260 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
37270 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61  uccessful, upgra
37280 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50  de to.      ** P
37290 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
372a0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
372b0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
372c0 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
372d0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
372e0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
372f0 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
37300 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
37310 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
37320 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
37330 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
37340 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
37350 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
37360 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69   it.  */.      i
37370 66 28 20 65 78 46 6c 61 67 3e 3d 30 20 29 7b 0a  f( exFlag>=0 ){.
37380 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37390 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
373a0 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
373b0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
373c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
373d0 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61       /* Obtain a
373e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
373f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
37400 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
37410 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
37420 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74     ** is true, t
37430 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hen immediately 
37440 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20  upgrade this to 
37450 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
37460 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  k. The.      ** 
37470 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
37480 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65  lback can be use
37490 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  d when upgrading
374a0 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56   to the EXCLUSIV
374b0 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c  E.      ** lock,
374c0 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62   but not when ob
374d0 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45  taining the RESE
374e0 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  RVED lock..     
374f0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
37500 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
37510 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
37520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
37530 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
37540 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Flag>0 ){.      
37550 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
37560 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
37570 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
37580 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37590 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
375a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
375b0 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52   /* Change to WR
375c0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
375d0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
375e0 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65    ** WAL mode se
375f0 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  ts Pager.eState 
37600 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  to PAGER_WRITER_
37610 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d  LOCKED or CACHEM
37620 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  OD.      ** when
37630 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20   it has an open 
37640 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
37650 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20   never to DBMOD 
37660 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20  or FINISHED..   
37670 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
37680 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73  cause in those s
37690 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  tates the code t
376a0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
376b0 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
376c0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79  transactions may
376d0 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
376e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
376f0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
37700 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
37710 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f   as well as into
37720 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
37730 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   Which would be 
37740 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20  incorrect in .  
37750 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e      ** WAL mode.
37760 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37770 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
37780 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
37790 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67  CKED;.      pPag
377a0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
377b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
377c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
377d0 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  bFileSize = pPag
377e0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
377f0 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
37800 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
37810 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
37820 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
37830 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
37840 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
37850 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
37860 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
37870 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73  EADER );.    ass
37880 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
37890 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
378a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
378b0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
378c0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
378d0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
378e0 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  er) );.  }..  PA
378f0 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53  GERTRACE(("TRANS
37900 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
37910 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
37920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37930 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67  ./*.** Write pag
37940 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65  e pPg onto the e
37950 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  nd of the rollba
37960 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  ck journal..*/.s
37970 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
37980 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41  NLINE int pagerA
37990 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b  ddPageToRollback
379a0 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70  Journal(PgHdr *p
379b0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
379c0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
379d0 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  er;.  int rc;.  
379e0 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61  u32 cksum;.  cha
379f0 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34  r *pData2;.  i64
37a00 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e   iOff = pPager->
37a10 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
37a20 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
37a30 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
37a40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
37a50 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63  page that.  ** c
37a60 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
37a70 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
37a80 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
37a90 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20  t verifies.  ** 
37aa0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
37ab0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
37ac0 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
37ad0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
37ae0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
37af0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d  er->journalHdr<=
37b00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
37b10 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70  ff );.  CODEC2(p
37b20 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
37b30 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
37b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
37b50 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61  OMEM_BKPT, pData
37b60 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70 61  2);.  cksum = pa
37b70 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
37b80 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
37b90 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e  .  /* Even if an
37ba0 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
37bb0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
37bc0 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74  le journalling t
37bd0 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  he.  ** page in 
37be0 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
37bf0 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79   set the need-sy
37c00 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  nc flag for the 
37c10 70 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  page..  ** Other
37c20 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
37c30 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
37c40 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
37c50 6f 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c 61  ogic in.  ** pla
37c60 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
37c70 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74   will think that
37c80 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
37c90 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20  to be restored. 
37ca0 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62   ** in the datab
37cb0 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66  ase file. And if
37cc0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
37cd0 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20  urs while doing 
37ce0 73 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 6f  so,.  ** then co
37cf0 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c  rruption may fol
37d00 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  low..  */.  pPg-
37d10 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
37d20 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72 63  NEED_SYNC;..  rc
37d30 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
37d40 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66  Pager->jfd, iOff
37d50 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
37d60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37d70 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
37d80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
37d90 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
37da0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
37db0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66  ->pageSize, iOff
37dc0 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
37dd0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
37de0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 77 72 69  n rc;.  rc = wri
37df0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
37e00 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65  >jfd, iOff+pPage
37e10 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63  r->pageSize+4, c
37e20 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
37e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
37e40 75 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52 41  urn rc;..  IOTRA
37e50 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
37e60 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
37e70 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
37e80 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
37e90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
37ea0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
37eb0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
37ec0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
37ed0 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  itej_count);.  P
37ee0 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
37ef0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
37f00 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
37f10 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
37f20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
37f30 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
37f40 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
37f50 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
37f60 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70  C)?1:0), pager_p
37f70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
37f80 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
37f90 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61  alOff += 8 + pPa
37fa0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
37fb0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
37fc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37fd0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
37fe0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
37ff0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
38000 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
38010 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65  pPg->pgno);.  te
38020 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
38030 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61 73  TE_NOMEM );.  as
38040 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
38050 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
38060 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63 20  E_NOMEM );.  rc 
38070 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  |= addToSavepoin
38080 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
38090 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61   pPg->pgno);.  a
380a0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
380b0 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
380c0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65  TE_NOMEM );.  re
380d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
380e0 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20  * Mark a single 
380f0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
38100 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65  teable. The page
38110 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
38120 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f   the .** main jo
38130 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
38140 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64  rnal as required
38150 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
38160 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
38170 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   one of the jour
38180 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73  nals, the corres
38190 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
381a0 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61  et in the .** Pa
381b0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
381c0 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61  itvec and the Pa
381d0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
381e0 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
381f0 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e  s.** of any open
38200 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61   savepoints as a
38210 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
38220 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
38230 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
38240 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
38250 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
38260 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
38270 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68  ITE_OK;..  /* Th
38280 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
38290 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20  t called unless 
382a0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
382b0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
382c0 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74  .  ** been start
382d0 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  ed. The journal 
382e0 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
382f0 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74  not be open at t
38300 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
38310 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  It is never call
38320 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  ed in the ERROR 
38330 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  state..  */.  as
38340 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
38350 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
38360 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
38370 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
38380 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
38390 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
383a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
383b0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
383c0 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
383d0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
383e0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
383f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
38400 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30  ager->errCode==0
38410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
38420 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ager->readOnly==
38430 30 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50 41 47  0 );.  CHECK_PAG
38440 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68  E(pPg);..  /* Th
38450 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
38460 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65  eeds to be opene
38470 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20  d. Higher level 
38480 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c  routines have al
38490 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69  ready.  ** obtai
384a0 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  ned the necessar
384b0 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e  y locks to begin
384c0 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
384d0 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a  action, but the.
384e0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f    ** rollback jo
384f0 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
38500 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65  yet be open. Ope
38510 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73  n it now if this
38520 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
38530 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
38540 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  done before call
38550 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
38560 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20  eMakeDirty() on 
38570 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20  the page. .  ** 
38580 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74  Otherwise, if it
38590 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72   were done after
385a0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
385b0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
385c0 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20  ), then.  ** an 
385d0 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75  error might occu
385e0 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  r and the pager 
385f0 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20  would end up in 
38600 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
38610 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61  ate.  ** with pa
38620 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69  ges marked as di
38630 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  rty in the cache
38640 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
38650 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
38660 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
38670 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
38680 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
38690 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
386a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
386b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
386c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
386d0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
386e0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRI